summaryrefslogtreecommitdiff
path: root/src/c
diff options
context:
space:
mode:
authorGravatar Ziv Scully <ziv@mit.edu>2015-09-12 17:11:33 -0400
committerGravatar Ziv Scully <ziv@mit.edu>2015-09-12 17:11:33 -0400
commit6aadea0202190d17a35f289f984eb19ec8116672 (patch)
treee981fc563a09eab62b50f3ba52eaa01cac157f3e /src/c
parent5c4c302aea71f47679e8d8b4197f869355b2180a (diff)
parent03f1d80a665c4de6fd83ff6dc9399dda97838efa (diff)
Merge.
Diffstat (limited to 'src/c')
-rw-r--r--src/c/http.c2
-rw-r--r--src/c/openssl.c40
-rw-r--r--src/c/urweb.c5
3 files changed, 41 insertions, 6 deletions
diff --git a/src/c/http.c b/src/c/http.c
index e6c7b1af..9059746f 100644
--- a/src/c/http.c
+++ b/src/c/http.c
@@ -314,7 +314,7 @@ static void *worker(void *data) {
}
static void help(char *cmd) {
- printf("Usage: %s [-p <port>] [-a <IP address>] [-t <thread count>] [-k] [-q] [-T SEC]\nThe '-k' option turns on HTTP keepalive.\nThe '-q' option turns off some chatter on stdout.\nThe -T option sets socket recv timeout (0 disables timeout, default is 5 sec)", cmd);
+ printf("Usage: %s [-p <port>] [-a <IP address>] [-t <thread count>] [-k] [-q] [-T SEC]\nThe '-k' option turns on HTTP keepalive.\nThe '-q' option turns off some chatter on stdout.\nThe '-T' option sets socket recv timeout (0 disables timeout, default is 5 sec).\n", cmd);
}
static void sigint(int signum) {
diff --git a/src/c/openssl.c b/src/c/openssl.c
index 1d820a34..6d018707 100644
--- a/src/c/openssl.c
+++ b/src/c/openssl.c
@@ -1,5 +1,6 @@
#include "config.h"
+#include <assert.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
@@ -7,12 +8,17 @@
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
+#include <pthread.h>
+#include <openssl/crypto.h>
#include <openssl/sha.h>
#include <openssl/rand.h>
#define PASSSIZE 4
+// OpenSSL locks array. See threads(3SSL).
+static pthread_mutex_t *openssl_locks;
+
int uw_hash_blocksize = 32;
static int password[PASSSIZE];
@@ -27,7 +33,41 @@ static void random_password() {
}
}
+// OpenSSL callbacks
+static void thread_id(CRYPTO_THREADID *const result) {
+ CRYPTO_THREADID_set_numeric(result, pthread_self());
+}
+static void lock_or_unlock(const int mode, const int type, const char *file,
+ const int line) {
+ pthread_mutex_t *const lock = &openssl_locks[type];
+ if (mode & CRYPTO_LOCK) {
+ if (pthread_mutex_lock(lock)) {
+ fprintf(stderr, "Can't take lock at %s:%d\n", file, line);
+ exit(1);
+ }
+ } else {
+ if (pthread_mutex_unlock(lock)) {
+ fprintf(stderr, "Can't release lock at %s:%d\n", file, line);
+ exit(1);
+ }
+ }
+}
+
void uw_init_crypto() {
+ int i;
+ // Set up OpenSSL.
+ assert(openssl_locks == NULL);
+ openssl_locks = malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
+ if (!openssl_locks) {
+ perror("malloc");
+ exit(1);
+ }
+ for (i = 0; i < CRYPTO_num_locks(); ++i) {
+ pthread_mutex_init(&(openssl_locks[i]), NULL);
+ }
+ CRYPTO_THREADID_set_callback(thread_id);
+ CRYPTO_set_locking_callback(lock_or_unlock);
+ // Prepare signatures.
if (uw_sig_file) {
int fd;
diff --git a/src/c/urweb.c b/src/c/urweb.c
index faef4d3a..66fedfa2 100644
--- a/src/c/urweb.c
+++ b/src/c/urweb.c
@@ -169,13 +169,8 @@ void *uw_init_client_data();
void uw_free_client_data(void *);
void uw_copy_client_data(void *dst, void *src);
-static pthread_mutex_t rand_mutex = PTHREAD_MUTEX_INITIALIZER;
-
static uw_Basis_int my_rand() {
- pthread_mutex_lock(&rand_mutex);
int ret, r = RAND_bytes((unsigned char *)&ret, sizeof ret);
- pthread_mutex_unlock(&rand_mutex);
-
if (r)
return abs(ret);
else