summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libcrypto/crypto_init.c5
-rw-r--r--src/lib/libcrypto/crypto_lock.c66
2 files changed, 55 insertions, 16 deletions
diff --git a/src/lib/libcrypto/crypto_init.c b/src/lib/libcrypto/crypto_init.c
index 3745e2e718..67e7920890 100644
--- a/src/lib/libcrypto/crypto_init.c
+++ b/src/lib/libcrypto/crypto_init.c
@@ -23,6 +23,7 @@
23#include <openssl/conf.h> 23#include <openssl/conf.h>
24#include <openssl/evp.h> 24#include <openssl/evp.h>
25#include <openssl/err.h> 25#include <openssl/err.h>
26
26#include "cryptlib.h" 27#include "cryptlib.h"
27 28
28int OpenSSL_config(const char *); 29int OpenSSL_config(const char *);
@@ -30,17 +31,15 @@ int OpenSSL_no_config(void);
30 31
31static pthread_t crypto_init_thread; 32static pthread_t crypto_init_thread;
32 33
33void crypto_init_locks(void);
34
35static void 34static void
36OPENSSL_init_crypto_internal(void) 35OPENSSL_init_crypto_internal(void)
37{ 36{
38 crypto_init_thread = pthread_self(); 37 crypto_init_thread = pthread_self();
38
39 OPENSSL_cpuid_setup(); 39 OPENSSL_cpuid_setup();
40 ERR_load_crypto_strings(); 40 ERR_load_crypto_strings();
41 OpenSSL_add_all_ciphers(); 41 OpenSSL_add_all_ciphers();
42 OpenSSL_add_all_digests(); 42 OpenSSL_add_all_digests();
43 crypto_init_locks();
44} 43}
45 44
46int 45int
diff --git a/src/lib/libcrypto/crypto_lock.c b/src/lib/libcrypto/crypto_lock.c
index 3d615cf485..5d317a81c0 100644
--- a/src/lib/libcrypto/crypto_lock.c
+++ b/src/lib/libcrypto/crypto_lock.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: crypto_lock.c,v 1.1 2018/11/11 06:41:28 bcook Exp $ */ 1/* $OpenBSD: crypto_lock.c,v 1.2 2018/11/28 15:51:32 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018 Brent Cook <bcook@openbsd.org> 3 * Copyright (c) 2018 Brent Cook <bcook@openbsd.org>
4 * 4 *
@@ -19,16 +19,54 @@
19 19
20#include <openssl/crypto.h> 20#include <openssl/crypto.h>
21 21
22static pthread_mutex_t locks[CRYPTO_NUM_LOCKS]; 22static pthread_mutex_t locks[] = {
23 PTHREAD_MUTEX_INITIALIZER,
24 PTHREAD_MUTEX_INITIALIZER,
25 PTHREAD_MUTEX_INITIALIZER,
26 PTHREAD_MUTEX_INITIALIZER,
27 PTHREAD_MUTEX_INITIALIZER,
28 PTHREAD_MUTEX_INITIALIZER,
29 PTHREAD_MUTEX_INITIALIZER,
30 PTHREAD_MUTEX_INITIALIZER,
31 PTHREAD_MUTEX_INITIALIZER,
32 PTHREAD_MUTEX_INITIALIZER,
33 PTHREAD_MUTEX_INITIALIZER,
34 PTHREAD_MUTEX_INITIALIZER,
35 PTHREAD_MUTEX_INITIALIZER,
36 PTHREAD_MUTEX_INITIALIZER,
37 PTHREAD_MUTEX_INITIALIZER,
38 PTHREAD_MUTEX_INITIALIZER,
39 PTHREAD_MUTEX_INITIALIZER,
40 PTHREAD_MUTEX_INITIALIZER,
41 PTHREAD_MUTEX_INITIALIZER,
42 PTHREAD_MUTEX_INITIALIZER,
43 PTHREAD_MUTEX_INITIALIZER,
44 PTHREAD_MUTEX_INITIALIZER,
45 PTHREAD_MUTEX_INITIALIZER,
46 PTHREAD_MUTEX_INITIALIZER,
47 PTHREAD_MUTEX_INITIALIZER,
48 PTHREAD_MUTEX_INITIALIZER,
49 PTHREAD_MUTEX_INITIALIZER,
50 PTHREAD_MUTEX_INITIALIZER,
51 PTHREAD_MUTEX_INITIALIZER,
52 PTHREAD_MUTEX_INITIALIZER,
53 PTHREAD_MUTEX_INITIALIZER,
54 PTHREAD_MUTEX_INITIALIZER,
55 PTHREAD_MUTEX_INITIALIZER,
56 PTHREAD_MUTEX_INITIALIZER,
57 PTHREAD_MUTEX_INITIALIZER,
58 PTHREAD_MUTEX_INITIALIZER,
59 PTHREAD_MUTEX_INITIALIZER,
60 PTHREAD_MUTEX_INITIALIZER,
61 PTHREAD_MUTEX_INITIALIZER,
62 PTHREAD_MUTEX_INITIALIZER,
63 PTHREAD_MUTEX_INITIALIZER,
64};
23 65
24void 66#define CTASSERT(x) extern char _ctassert[(x) ? 1 : -1 ] \
25crypto_init_locks(void) 67 __attribute__((__unused__))
26{
27 int i;
28 68
29 for (i = 0; i < CRYPTO_NUM_LOCKS; i++) 69CTASSERT((sizeof(locks) / sizeof(*locks)) == CRYPTO_NUM_LOCKS);
30 pthread_mutex_init(&locks[i], NULL);
31}
32 70
33void 71void
34CRYPTO_lock(int mode, int type, const char *file, int line) 72CRYPTO_lock(int mode, int type, const char *file, int line)
@@ -37,19 +75,21 @@ CRYPTO_lock(int mode, int type, const char *file, int line)
37 return; 75 return;
38 76
39 if (mode & CRYPTO_LOCK) 77 if (mode & CRYPTO_LOCK)
40 pthread_mutex_lock(&locks[type]); 78 (void) pthread_mutex_lock(&locks[type]);
41 else 79 else if (mode & CRYPTO_UNLOCK)
42 pthread_mutex_unlock(&locks[type]); 80 (void) pthread_mutex_unlock(&locks[type]);
43} 81}
44 82
45int 83int
46CRYPTO_add_lock(int *pointer, int amount, int type, const char *file, 84CRYPTO_add_lock(int *pointer, int amount, int type, const char *file,
47 int line) 85 int line)
48{ 86{
49 int ret = 0; 87 int ret;
88
50 CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE, type, file, line); 89 CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE, type, file, line);
51 ret = *pointer + amount; 90 ret = *pointer + amount;
52 *pointer = ret; 91 *pointer = ret;
53 CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE, type, file, line); 92 CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE, type, file, line);
93
54 return (ret); 94 return (ret);
55} 95}