From 1b79fcb646f66682a62cf34f3cc343b1a9706699 Mon Sep 17 00:00:00 2001 From: "Jorge Boncompte [DTI2]" Date: Mon, 7 May 2012 15:17:31 +0000 Subject: lib: fix thread_cancel_event() ospfd was crashing some times on neighbour going down. The cause was that ospf_nsm_event() was accessing already freed memory in ospf_nbr_delete() call from ospf_nsm_event(). What happens is that since commit b5043aab (lib: fix incorrect thread list...) now a thread can be on the event and ready lists but thread_cancel_event() doesn't account for that. * thread.c: (thread_cancel_event) loop on the ready list too to cancel pending events. Signed-off-by: Jorge Boncompte [DTI2] Signed-off-by: David Lamparter --- lib/thread.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'lib') diff --git a/lib/thread.c b/lib/thread.c index b36c43a9..dd0413b3 100644 --- a/lib/thread.c +++ b/lib/thread.c @@ -916,6 +916,24 @@ thread_cancel_event (struct thread_master *m, void *arg) thread_add_unuse (m, t); } } + + /* thread can be on the ready list too */ + thread = m->ready.head; + while (thread) + { + struct thread *t; + + t = thread; + thread = t->next; + + if (t->arg == arg) + { + ret++; + thread_list_delete (&m->ready, t); + t->type = THREAD_UNUSED; + thread_add_unuse (m, t); + } + } return ret; } -- cgit v1.2.1