Use PTHREAD_CREATE_DETACHED macro instead of 1: fix Solaris crash

When calling pthread_attr_setdetachstate, we were using 1 as the
argument. But the pthreads documentation says that you have to say
PTHREAD_CREATE_DETACH, which on Solaris is apparently 0x40.  Calling
pthread_attr_setdetachstate with 1 crashes on Solaris with FLTBOUNDS.

(Because we're so late in the release cycle, I made the code define
PTHREAD_CREATE_DETACHED if it doesn't exist, so we aren't likely to
break any other platforms.)

This bug was introduced when we made threading mandatory in
0.2.6.1-alpha; previously, we had force-disabled threading on
Solaris.  See #9495 discussion.
This commit is contained in:
Nick Mathewson 2015-03-12 09:49:45 -04:00
parent 985687bc4f
commit 192ed94410
2 changed files with 9 additions and 1 deletions

4
changes/bug9495_redux Normal file
View File

@ -0,0 +1,4 @@
o Major bugfixes (portability):
- Do not crash on startup when running on Solaris. Fixes a bug
related to our fix for 9495; bugfix on 0.2.6.1-alpha. Reported
by "ruebezahl".

View File

@ -279,7 +279,11 @@ tor_threads_init(void)
pthread_mutexattr_init(&attr_recursive);
pthread_mutexattr_settype(&attr_recursive, PTHREAD_MUTEX_RECURSIVE);
tor_assert(0==pthread_attr_init(&attr_detached));
tor_assert(0==pthread_attr_setdetachstate(&attr_detached, 1));
#ifndef PTHREAD_CREATE_DETACHED
#define PTHREAD_CREATE_DETACHED 1
#endif
tor_assert(0==pthread_attr_setdetachstate(&attr_detached,
PTHREAD_CREATE_DETACHED));
threads_initialized = 1;
set_main_thread();
}