Prechádzať zdrojové kódy

r11850@catbus: nickm | 2007-02-20 13:34:13 -0500
Apply patch from coderman: have posix subthreads mask out signals. This could prevent some kinds of crashes when subthreads try to handle SIGPIPEs and die in the attempt. Backport candidate.


svn:r9603

Nick Mathewson 18 rokov pred
rodič
commit
b6e6b7101b
2 zmenil súbory, kde vykonal 12 pridanie a 0 odobranie
  1. 3 0
      ChangeLog
  2. 9 0
      src/common/compat.c

+ 3 - 0
ChangeLog

@@ -39,6 +39,9 @@ Changes in version 0.1.2.8-alpha - 2007-??-??
     - When EntryNodes are configured, rebuild the guard list to contain, in
       order: the EntryNodes that were guards before; the rest of the
       EntryNodes; the nodes that were guards before.
+    - Mask out all signals in sub-threads; only the libevent signal handler
+      should be processing them. This should prevent some crashes on some
+      machines using pthreads. (Patch from coderman.)
 
   o Minor features (controller):
     - Warn the user when an application uses the obsolete binary v0

+ 9 - 0
src/common/compat.c

@@ -82,6 +82,9 @@ const char compat_c_id[] =
 #ifdef HAVE_PTHREAD_H
 #include <pthread.h>
 #endif
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
 #ifdef HAVE_UTIME_H
 #include <utime.h>
 #endif
@@ -996,6 +999,12 @@ tor_pthread_helper_fn(void *_data)
   tor_pthread_data_t *data = _data;
   void (*func)(void*);
   void *arg;
+  /* mask signals to worker threads to avoid SIGPIPE, etc */
+  sigset_t sigs;
+  /* We're in a subthread; don't handle any signals here. */
+  sigfillset(&sigs);
+  pthread_sigmask(SIG_SETMASK, &sigs, NULL);
+
   func = data->func;
   arg = data->data;
   tor_free(_data);