forked from Mirror/frr
lib: fix incorrect thread list processing loops
* thread.c: (thread_timer_process,thread_process) thread_list_delete nulls thread->next. Loops need to save next first, or will only process the head. Problem noted by Lou Berger <lberger@labn.net>.
This commit is contained in:
parent
b51a3a3150
commit
b5043aabb0
|
@ -972,10 +972,12 @@ static unsigned int
|
|||
thread_timer_process (struct thread_list *list, struct timeval *timenow)
|
||||
{
|
||||
struct thread *thread;
|
||||
struct thread *next;
|
||||
unsigned int ready = 0;
|
||||
|
||||
for (thread = list->head; thread; thread = thread->next)
|
||||
for (thread = list->head; thread; thread = next)
|
||||
{
|
||||
next = thread->next;
|
||||
if (timeval_cmp (*timenow, thread->u.sands) < 0)
|
||||
return ready;
|
||||
thread_list_delete (list, thread);
|
||||
|
@ -991,10 +993,12 @@ static unsigned int
|
|||
thread_process (struct thread_list *list)
|
||||
{
|
||||
struct thread *thread;
|
||||
struct thread *next;
|
||||
unsigned int ready = 0;
|
||||
|
||||
for (thread = list->head; thread; thread = thread->next)
|
||||
for (thread = list->head; thread; thread = next)
|
||||
{
|
||||
next = thread->next;
|
||||
thread_list_delete (list, thread);
|
||||
thread->type = THREAD_READY;
|
||||
thread_list_add (&thread->master->ready, thread);
|
||||
|
|
Loading…
Reference in a new issue