|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Timur Khanjanov 2:5020/400 31 Aug 2005 13:00:15 To : All Subject : mpd, pppoe на куче интерфейсов и грабли, присыпанные листьями --------------------------------------------------------------------------------
наступил вчера на вот такие грабли
если завести pppoe через mpd на более чем 64х физических интерфейсах
то на 65м получаем sigsegv и зависание mpd с полной загрузкой процессора
и отсутствием реакции на что бы то ни было кроме kill -9
после копания в исходниках с gdb в зубах обнаружил следуещее
Массивы содержащие линки и бандлы - динамические и удлиняются через
функцию LengthenArray
но в файле pppoe.c видим следующее на 154й строке
int PppoeIfCount=0;
struct PppoeIf PppoeIfs[64];
итак - физические интерфейсы для линков хранятся в _статическом_ массиве
на 64 элемента
смотрим дальше
в функции PppoeNodeUpdate производится его заполнение
проверка на переполнение массива _не производися_
в результате на 65м интерфейсе
вот в этой строке (~830)
PppoeIfs[PppoeIfCount++].listen=0;
нолик записывается аккурат в указатель на массив бандлов
и потом при попытке добавить новый бандл получаем 11й сигнал
дальше - больше - при приходе сигнала мпд пытается всё закрыть
опять лезет в массив бандлов опять получает 11й сигнал и так
пока его не снимут через kill -9
пока прописал там размер массива на 256, но пожалуй там надо
сделать как в списках бандлов/линков динамический массив и
увеличение через LenghtenArray
--
Homo Homini domini est
--- ifmail v.2.15dev5.3
* Origin: Gamma NNTP server Moscow Russia (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.unix.bsd/10169dff89991.html, оценка из 5, голосов 10
|