Browse Source

lib/thread: Address other paths from thread_execute to thread_add_unuse

* lib/thread.c: There are further paths from thread_execute to
  thread_add_unuse, beyond that from bugzilla bug#975.  See:

    https://bugzilla.quagga.net/show_bug.cgi?id=977

  Two solutions:

  a) Make the paths from thread_execute to thread_add_unuse, inc.
     thread_add_unuse tolerant to dummy threads.

  b) Have thread_execute properly obtain a thread struct, rather than
     fake one on its heap.

  Trying option a. Option b perhaps is more robust though.

  (thread_add_unuse) Be tolerant of NULL master threads passed in, that
  /ought/ to be dummy/non-heap threads, and just ignore.  Don't assert.
  (thread_call) no point checking for NULL master here anymore.
Paul Jakma 1 year ago
parent
commit
f0795835ee
1 changed files with 6 additions and 4 deletions
  1. 6 4
      lib/thread.c

+ 6 - 4
lib/thread.c

@@ -603,8 +603,12 @@ thread_add_fd (struct thread **thread_array, struct thread *thread)
 static void
 thread_add_unuse (struct thread *thread)
 {
+  assert (thread);
+  /* thread_execute uses dummy threads, allocated on its stack */
+  if (thread->master == NULL)
+    return;
+  
   thread->type = THREAD_UNUSED;
-  assert (thread->master != NULL && thread != NULL);
   assert (thread->next == NULL);
   assert (thread->prev == NULL);
   thread_list_add (&thread->master->unuse, thread);
@@ -1342,9 +1346,7 @@ thread_call (struct thread *thread)
     }
 #endif /* CONSUMED_TIME_CHECK */
 
-  
-  if (thread->master)
-    thread_add_unuse (thread);
+  thread_add_unuse (thread);
 }
 
 /* Execute thread */