Bug 12628 - segmentation fault netstat -I eth0
Summary: segmentation fault netstat -I eth0
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: net-tools (show other bugs)
Version: unstable
Hardware: all Linux
: P2 normal
Assignee: placeholder@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords: patch
Depends on:
Blocks:
 
Reported: 2007-08-25 14:08 MSD by viy
Modified: 2008-12-03 12:55 MSK (History)
5 users (show)

See Also:


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

Note You need to log in before you can comment on or make changes to this bug.
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