Bug 12628

Summary: segmentation fault netstat -I eth0
Product: Sisyphus Reporter: viy <viy>
Component: net-toolsAssignee: placeholder <placeholder>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P2 CC: glebfm, icesik, ldv, php-coder, placeholder
Version: unstableKeywords: patch
Hardware: all   
OS: Linux   
Attachments:
Description Flags
Updated patch version none

Description viy 2007-08-25 14:08:37 MSD
$ rpm -qf /bin/netstat     
net-tools-1.60-alt13
igor@breeze ~ $ sudo netstat -I eth0     
zsh: segmentation fault  sudo netstat -I eth0
igor@breeze ~ $ uname -a
Linux breeze.localdomain 2.6.18-ovz-smp-alt14 #1 SMP Wed May 2 15:41:34 MSD 2007
x86_64 GNU/Linux
Comment 1 Dmitry V. Levin 2007-09-18 12:49:08 MSD
confirmed; who wants to update net-tools patchset from FC?
Comment 2 Igor Zubkov 2007-12-10 04:56:53 MSK
(In reply to comment #1)
> confirmed; who wants to update net-tools patchset from FC?

i will sync with patches with F and report about this.
Comment 3 Slava Semushin 2008-07-18 10:04:36 MSD
(In reply to comment #2)
> i will sync with patches with F and report about this.

*ping*
Comment 4 Slava Semushin 2008-07-18 10:49:42 MSD
Как netstat -I (без аргумента) тоже падает.
Comment 5 Slava Semushin 2008-07-18 11:04:02 MSD
Ошибка в этом куске кода (файл netstat.c):

1787     case 'I':
1788             if (optarg && strcmp(optarg, "(null)"))
1789             if (optarg[0] == '=') optarg++;
1790                 flag_int_name = strdup(optarg);
1791         flag_int++;
1792         break;

Первый if проверяет, чтобы optarg не была NULL, проверяет довольно странно (я бы проверял как otarg != NULL или просто optarg), но идея в этом. Второй if проверяет случай когда опция укзаана как -I=eth0. Если аргумент знак равно, то переходим к следующему аргументу строки. И наконец третья строка пытается сохранить в flag_int_name копию аргумента (eth0).

Падает всё в случае, когда optarg == NULL. Судя по отступам можно понять чего автор хотел, вот только он забыл добавить скобок. Он хотел, чтобы строка 1789 и 1790 выполнялись, только если первый if вернул истину. Но получилось, что строка 1790 выполняется всегда, т.к. не принадлежит телу первого if-а.

Кстати, в оригинальном коде программы этого куска кода нет. Он привнесен патчами net-tools-1.60-rh-netstat-ifaceopt.patch и net-tools-1.60-rh-netstat-I.patch (кстати, патчи добавляют опцию -I но не патчат man, в итоге а мане этой опции нет, что тоже баг).
Comment 6 Slava Semushin 2008-07-18 11:15:58 MSD
А, ну всё понятно.

Вот каким должен быть код:

1787     case 'I':
1788             if (optarg != NULL) {
1789                 if (optarg[0] == '=') {
1790                     optarg++; 
1791                 }   
1792                 flag_int_name = strdup(optarg);
1793             }   
1794         flag_int++;
1795         break;

Обратите внимание, что вызывать netstat -I eth0 -- НЕ правильно. Надо: netstat -I=eth0

Вот валидные опции:
- I
- --interfaces
- I=eth0
- --interfaces=eth0

Вот так с приведенным выше кодом всё будет работать. А на -I eth0 будет выдавать usage.
Comment 7 Slava Semushin 2008-07-18 11:40:24 MSD
Created attachment 2708 [details]
Updated patch version

Для исправления этой баги нужно:
- поравить спек (не прикладывать патч net-tools-1.60-rh-netstat-I.patch)
- удалить патч net-tools-1.60-rh-netstat-I.patch
- заменить патч net-tools-1.60-rh-netstat-ifaceopt.patch на тот, который я сейчас прикладываю

После этого всё работает.
Comment 8 Dmitry V. Levin 2008-11-30 18:56:51 MSK
Вроде бы fixed in 1.60-alt14