Commit b6c8a14b authored by Nick Mathewson's avatar Nick Mathewson 🤹
Browse files

Merge remote-tracking branch 'public/bug4345a_024'

parents 1bbd3811 1ebdaf57
Loading
Loading
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".
+11 −5
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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
@@ -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();
  }
+6 −1
Original line number Diff line number Diff line
@@ -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 */