|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Timur Khanjanov 2:5020/400 31 Aug 2005 19:00:38 To : Gleb Smirnoff Subject : Re: mpd, pppoe на куче интерфейсов и грабли, присыпанные листьями -------------------------------------------------------------------------------- В письме Wed, 31 Aug 2005 12:38:04 +0000, Gleb Smirnoff написал: > Timur Khanjanov <intel@intrans.baku.az> wrote: >>> TK> наступил вчера на вот такие грабли >>> TK> если завести pppoe через mpd на более чем 64х физических интерфейсах >>> TK> то на 65м получаем sigsegv и зависание mpd с полной загрузкой процессора >>> TK> и отсутствием реакции на что бы то ни было кроме kill -9 >>> TK> после копания в исходниках с gdb в зубах обнаружил следуещее >>> TK> Массивы содержащие линки и бандлы - динамические и удлиняются через >>> TK> функцию LengthenArray >>> TK> но в файле pppoe.c видим следующее на 154й строке >>> TK> int PppoeIfCount=0; >>> TK> struct PppoeIf PppoeIfs[64]; итак - физические интерфейсы для линков >>> TK> хранятся в _статическом_ массиве на 64 элемента смотрим дальше в функции >>> TK> PppoeNodeUpdate производится его заполнение проверка на переполнение >>> TK> массива _не производися_ в результате на 65м интерфейсе вот в этой >>> TK> строке (~830) PppoeIfs[PppoeIfCount++].listen=0; нолик >>> TK> записывается аккурат в указатель на массив бандлов и потом при попытке >>> TK> добавить новый бандл получаем 11й сигнал дальше - больше - при приходе >>> TK> сигнала мпд пытается всё закрыть опять лезет в массив бандлов опять >>> TK> получает 11й сигнал и так пока его не снимут через kill -9 >>> >>> TK> пока прописал там размер массива на 256, но пожалуй там надо >>> TK> сделать как в списках бандлов/линков динамический массив и >>> TK> увеличение через LenghtenArray >>> >>> Шлите патчи. :) > > TK> как только - так сразу Ж8) > TK> сходу могу только чтоб при превышении лимита матерился > > Уже будет намного лучше, чем то, что имеем сейчас. ну вот приблизительно так diff -u pppoe.h.orig pppoe.h - --- pppoe.h.orig Thu Sep 1 03:30:10 2005 +++ pppoe.h Thu Sep 1 03:30:21 2005 @@ -15,6 +15,12 @@ /* + * CONSTANTS + */ + +#define PHYS_INT_MAX 256 + +/* * VARIABLES */ diff -u pppoe.c.orig pppoe.c - --- pppoe.c.orig Wed Aug 31 21:24:44 2005 +++ pppoe.c Thu Sep 1 03:37:04 2005 @@ -152,7 +152,7 @@ EventRef ctrlEvent; /* listen for ctrl messages */ }; int PppoeIfCount=0; -struct PppoeIf PppoeIfs[256]; +struct PppoeIf PppoeIfs[PHYS_INT_MAX]; int PppoeListenUpdateSheduled=0; struct pppTimer PppoeListenUpdateTimer; @@ -823,6 +823,10 @@ j=i; }; if (j==-1) { + if(PppoeIfCount>=PHYS_INT_MAX){ + Log(LG_ERR, ("[%s] Can't create node on %s already has %d physical interfaces", lnk->name, p->path, (PHYS_INT_MAX) )); + return; + } if (CreatePppoeNode(p->path,p->hook)) { snprintf(PppoeIfs[PppoeIfCount].ifnodepath,sizeof(PppoeIfs[PppoeIfCount].i fnodepath),"%s",p->path); snprintf(PppoeIfs[PppoeIfCount].session,sizeof(PppoeIfs[PppoeIfCount].sess ion),"%s",p->session); не уверен что сообщение об ошибке грамматически правильно Ж8) патч неполный - при превышении лимита он всё равно грохается по 11му сигналу пытаясь напечатать [%s] PPPoE server listening on %s for service \"%s\" но хотя бы не зависает и громко матерится перед этим а по уму там всё равно динамический массив делать надо -- Homo Homini domini est --- ifmail v.2.15dev5.3 * Origin: Gamma NNTP server Moscow Russia (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.unix.bsd/1016937969064.html, оценка из 5, голосов 10
|