Browse Source

Merge remote-tracking branch 'public/bug4345a_024'

Nick Mathewson 10 years ago
parent
commit
b6c8a14bf3
3 changed files with 27 additions and 6 deletions
  1. 10 0
      changes/bug4345
  2. 11 5
      src/common/compat.c
  3. 6 1
      src/or/cpuworker.c

+ 10 - 0
changes/bug4345

@@ -0,0 +1,10 @@
+  o Minor bugfixes:
+    - Check return code on spawn_func() in cpuworker code, so that we don't
+      think we've spawned a nonworking cpuworker and write junk to it
+      forever. Fix related to bug 4345; bugfix on all released Tor versions.
+      Found by "skruffy".
+
+    - Use a pthread_attr to make sure that spawn_func() cannot return
+      an error while at the same time launching a thread. Fix related
+      to bug 4345; bugfix on all released Tor versions. Reported by
+      "cypherpunks".

+ 11 - 5
src/common/compat.c

@@ -2429,6 +2429,12 @@ tor_pthread_helper_fn(void *_data)
   func(arg);
   return NULL;
 }
+/**
+ * A pthread attribute to make threads start detached.
+ */
+static pthread_attr_t attr_detached;
+/** True iff we've called tor_threads_init() */
+static int threads_initialized = 0;
 #endif
 
 /** Minimalist interface to run a void function in the background.  On
@@ -2452,12 +2458,12 @@ spawn_func(void (*func)(void *), void *data)
 #elif defined(USE_PTHREADS)
   pthread_t thread;
   tor_pthread_data_t *d;
+  if (PREDICT_UNLIKELY(!threads_initialized))
+    tor_threads_init();
   d = tor_malloc(sizeof(tor_pthread_data_t));
   d->data = data;
   d->func = func;
-  if (pthread_create(&thread,NULL,tor_pthread_helper_fn,d))
-    return -1;
-  if (pthread_detach(thread))
+  if (pthread_create(&thread,&attr_detached,tor_pthread_helper_fn,d))
     return -1;
   return 0;
 #else
@@ -2814,8 +2820,6 @@ tor_get_thread_id(void)
  * "reentrant" mutexes (i.e., once we can re-lock if we're already holding
  * them.) */
 static pthread_mutexattr_t attr_reentrant;
-/** True iff we've called tor_threads_init() */
-static int threads_initialized = 0;
 /** Initialize <b>mutex</b> so it can be locked.  Every mutex must be set
  * up with tor_mutex_init() or tor_mutex_new(); not both. */
 void
@@ -2959,6 +2963,8 @@ tor_threads_init(void)
   if (!threads_initialized) {
     pthread_mutexattr_init(&attr_reentrant);
     pthread_mutexattr_settype(&attr_reentrant, PTHREAD_MUTEX_RECURSIVE);
+    tor_assert(0==pthread_attr_init(&attr_detached));
+    tor_assert(0==pthread_attr_setdetachstate(&attr_detached, 1));
     threads_initialized = 1;
     set_main_thread();
   }

+ 6 - 1
src/or/cpuworker.c

@@ -528,7 +528,12 @@ spawn_cpuworker(void)
   tor_assert(SOCKET_OK(fdarray[1]));
 
   fd = fdarray[0];
-  spawn_func(cpuworker_main, (void*)fdarray);
+  if (spawn_func(cpuworker_main, (void*)fdarray) < 0) {
+    tor_close_socket(fdarray[0]);
+    tor_close_socket(fdarray[1]);
+    tor_free(fdarray);
+    return -1;
+  }
   log_debug(LD_OR,"just spawned a cpu worker.");
 #ifndef TOR_IS_MULTITHREADED
   tor_close_socket(fdarray[1]); /* don't need the worker's side of the pipe */