Merge remote-tracking branch 'public/bug4345a_024'

This commit is contained in:
Nick Mathewson 2014-05-01 12:13:07 -04:00
commit b6c8a14bf3
3 changed files with 27 additions and 6 deletions

10
changes/bug4345 Normal file
View File

@ -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".

View File

@ -2429,6 +2429,12 @@ tor_pthread_helper_fn(void *_data)
func(arg); func(arg);
return NULL; 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 #endif
/** Minimalist interface to run a void function in the background. On /** 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) #elif defined(USE_PTHREADS)
pthread_t thread; pthread_t thread;
tor_pthread_data_t *d; tor_pthread_data_t *d;
if (PREDICT_UNLIKELY(!threads_initialized))
tor_threads_init();
d = tor_malloc(sizeof(tor_pthread_data_t)); d = tor_malloc(sizeof(tor_pthread_data_t));
d->data = data; d->data = data;
d->func = func; d->func = func;
if (pthread_create(&thread,NULL,tor_pthread_helper_fn,d)) if (pthread_create(&thread,&attr_detached,tor_pthread_helper_fn,d))
return -1;
if (pthread_detach(thread))
return -1; return -1;
return 0; return 0;
#else #else
@ -2814,8 +2820,6 @@ tor_get_thread_id(void)
* "reentrant" mutexes (i.e., once we can re-lock if we're already holding * "reentrant" mutexes (i.e., once we can re-lock if we're already holding
* them.) */ * them.) */
static pthread_mutexattr_t attr_reentrant; 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 /** 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. */ * up with tor_mutex_init() or tor_mutex_new(); not both. */
void void
@ -2959,6 +2963,8 @@ tor_threads_init(void)
if (!threads_initialized) { if (!threads_initialized) {
pthread_mutexattr_init(&attr_reentrant); pthread_mutexattr_init(&attr_reentrant);
pthread_mutexattr_settype(&attr_reentrant, PTHREAD_MUTEX_RECURSIVE); 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; threads_initialized = 1;
set_main_thread(); set_main_thread();
} }

View File

@ -528,7 +528,12 @@ spawn_cpuworker(void)
tor_assert(SOCKET_OK(fdarray[1])); tor_assert(SOCKET_OK(fdarray[1]));
fd = fdarray[0]; 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."); log_debug(LD_OR,"just spawned a cpu worker.");
#ifndef TOR_IS_MULTITHREADED #ifndef TOR_IS_MULTITHREADED
tor_close_socket(fdarray[1]); /* don't need the worker's side of the pipe */ tor_close_socket(fdarray[1]); /* don't need the worker's side of the pipe */