Loading changes/bug4345 0 → 100644 +10 −0 Original line number Diff line number Diff line 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". src/common/compat.c +11 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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(); } Loading src/or/cpuworker.c +6 −1 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading
changes/bug4345 0 → 100644 +10 −0 Original line number Diff line number Diff line 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".
src/common/compat.c +11 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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(); } Loading
src/or/cpuworker.c +6 −1 Original line number Diff line number Diff line Loading @@ -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 */ Loading