Bug 12628 - segmentation fault netstat -I eth0
: segmentation fault netstat -I eth0
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/net-tools)
: unstable
: all Linux
: P2 normal
Assigned To:
:
:
: patch
:
:
  Show dependency tree
 
Reported: 2007-08-25 14:08 by
Modified: 2008-12-03 12:55 (History)


Attachments
Updated patch version (2.09 KB, patch)
2008-07-18 11:40, Slava Semushin
no flags Details | Diff


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2007-08-25 14:08:37
$ 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 From 2007-09-18 12:49:08 -------
confirmed; who wants to update net-tools patchset from FC?
------- Comment #2 From 2007-12-10 04:56:53 -------
(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 From 2008-07-18 10:04:36 -------
(In reply to comment #2)
> i will sync with patches with F and report about this.

*ping*
------- Comment #4 From 2008-07-18 10:49:42 -------
Как netstat -I (без аргумента) тоже падает.
------- Comment #5 From 2008-07-18 11:04:02 -------
Ошибка в этом куске кода (файл 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 From 2008-07-18 11:15:58 -------
А, ну всё понятно.

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

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 From 2008-07-18 11:40:24 -------
Created an attachment (id=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 From 2008-11-30 18:56:51 -------
Вроде бы fixed in 1.60-alt14