Summary: | segmentation fault netstat -I eth0 | ||||||
---|---|---|---|---|---|---|---|
Product: | Sisyphus | Reporter: | viy <viy> | ||||
Component: | net-tools | Assignee: | placeholder <placeholder> | ||||
Status: | CLOSED FIXED | QA Contact: | qa-sisyphus | ||||
Severity: | normal | ||||||
Priority: | P2 | CC: | glebfm, icesik, ldv, php-coder, placeholder | ||||
Version: | unstable | Keywords: | patch | ||||
Hardware: | all | ||||||
OS: | Linux | ||||||
Attachments: |
|
Description
viy
2007-08-25 14:08:37 MSD
confirmed; who wants to update net-tools patchset from FC? (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. (In reply to comment #2) > i will sync with patches with F and report about this. *ping* Как netstat -I (без аргумента) тоже падает. Ошибка в этом куске кода (файл 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, в итоге а мане этой опции нет, что тоже баг). А, ну всё понятно. Вот каким должен быть код: 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. 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 на тот, который я сейчас прикладываю
После этого всё работает.
Вроде бы fixed in 1.60-alt14 |