소스 검색

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.
Nick Mathewson 9 년 전
부모
커밋
192ed94410
2개의 변경된 파일9개의 추가작업 그리고 1개의 파일을 삭제
  1. 4 0
      changes/bug9495_redux
  2. 5 1
      src/common/compat_pthreads.c

+ 4 - 0
changes/bug9495_redux

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

+ 5 - 1
src/common/compat_pthreads.c

@@ -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();
   }