From: fredrik Date: Thu, 16 Mar 2006 00:37:05 +0000 (+0000) Subject: Fix potential bug with freed timers. X-Git-Tag: 0.1~44 X-Git-Url: http://git.dolda2000.com/gitweb/?p=doldaconnect.git;a=commitdiff_plain;h=dae3c8b486e3283767205fd78cdf4eb1840c4ef6 Fix potential bug with freed timers. git-svn-id: svn+ssh://svn.dolda2000.com/srv/svn/repos/src/doldaconnect@590 959494ce-11ee-0310-bf91-de5d638817bd --- diff --git a/daemon/main.c b/daemon/main.c index 20aee80..025c5a2 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -373,7 +373,7 @@ int main(int argc, char **argv) FILE *pfstream, *confstream; int delay, immsyslog; struct module *mod; - struct timer *timer, *ntimer; + struct timer *timer; struct child *child; double now; @@ -527,20 +527,23 @@ int main(int argc, char **argv) } pollsocks(delay); now = ntime(); - for(timer = timers; timer != NULL; timer = ntimer) + do { - ntimer = timer->next; - if(now < timer->at) - continue; - if(timer->prev != NULL) - timer->prev->next = timer->next; - if(timer->next != NULL) - timer->next->prev = timer->prev; - if(timer == timers) - timers = timer->next; - timer->func(0, timer->data); - free(timer); - } + for(timer = timers; timer != NULL; timer = timer->next) + { + if(now < timer->at) + continue; + if(timer->prev != NULL) + timer->prev->next = timer->next; + if(timer->next != NULL) + timer->next->prev = timer->prev; + if(timer == timers) + timers = timer->next; + timer->func(0, timer->data); + free(timer); + break; + } + } while(timer != NULL); do { for(child = children; child != NULL; child = child->next)