Skip to content

Commit

Permalink
avoid race condition by making OpenSSL thread safe
Browse files Browse the repository at this point in the history
  • Loading branch information
rfuchs committed Dec 17, 2014
1 parent 7e72bfc commit 935487b
Showing 1 changed file with 32 additions and 0 deletions.
32 changes: 32 additions & 0 deletions daemon/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ struct main_context {


static int global_shutdown;
static mutex_t *openssl_locks;

static char *pidfile;
static gboolean foreground;
Expand Down Expand Up @@ -439,6 +440,36 @@ static void wpidfile(void) {
}


static void cb_openssl_threadid(CRYPTO_THREADID *tid) {
pthread_t me;

me = pthread_self();

if (sizeof(me) == sizeof(void *))
CRYPTO_THREADID_set_pointer(tid, (void *) me);
else
CRYPTO_THREADID_set_numeric(tid, (unsigned long) me);
}

static void cb_openssl_lock(int mode, int type, const char *file, int line) {
if ((type & CRYPTO_LOCK))
mutex_lock(&openssl_locks[type]);
else
mutex_unlock(&openssl_locks[type]);
}

static void make_OpenSSL_thread_safe(void) {
int i;

openssl_locks = malloc(sizeof(*openssl_locks) * CRYPTO_num_locks());
for (i = 0; i < CRYPTO_num_locks(); i++)
mutex_init(&openssl_locks[i]);

CRYPTO_THREADID_set_callback(cb_openssl_threadid);
CRYPTO_set_locking_callback(cb_openssl_lock);
}


static void init_everything() {
struct timespec ts;

Expand All @@ -447,6 +478,7 @@ static void init_everything() {
srandom(ts.tv_sec ^ ts.tv_nsec);
SSL_library_init();
SSL_load_error_strings();
make_OpenSSL_thread_safe();

#if !GLIB_CHECK_VERSION(2,32,0)
g_thread_init(NULL);
Expand Down

0 comments on commit 935487b

Please sign in to comment.