mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Merge remote-tracking branch 'public/bug4345a_024'
This commit is contained in:
commit
b6c8a14bf3
10
changes/bug4345
Normal file
10
changes/bug4345
Normal 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".
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user