diff options
author | daurnimator <quae@daurnimator.com> | 2017-08-31 02:40:47 +1000 |
---|---|---|
committer | daurnimator <quae@daurnimator.com> | 2017-08-31 02:40:47 +1000 |
commit | e917b0805fc9374b06cfd93204aefe5d3375d8d4 (patch) | |
tree | 81c4ff783958e648a62ffec6f5e4ba07999fa0ec | |
parent | d36d78f74c537c317528bc68ea734997054c6411 (diff) | |
parent | 13b82f5706ee9f430203c2559250056e5e12de72 (diff) | |
download | luaossl-e917b0805fc9374b06cfd93204aefe5d3375d8d4.tar.gz luaossl-e917b0805fc9374b06cfd93204aefe5d3375d8d4.tar.bz2 luaossl-e917b0805fc9374b06cfd93204aefe5d3375d8d4.zip |
Merge remote-tracking branch 'daurnimator/less-locks'
-rw-r--r-- | src/openssl.c | 46 |
1 files changed, 14 insertions, 32 deletions
diff --git a/src/openssl.c b/src/openssl.c index cea38a5..1b11207 100644 --- a/src/openssl.c +++ b/src/openssl.c | |||
@@ -1318,17 +1318,14 @@ static const EVP_MD *auxL_optdigest(lua_State *L, int index, EVP_PKEY *key, cons | |||
1318 | * Prevent loader from unlinking us if we've registered a callback with | 1318 | * Prevent loader from unlinking us if we've registered a callback with |
1319 | * OpenSSL by taking another reference to ourselves. | 1319 | * OpenSSL by taking another reference to ourselves. |
1320 | */ | 1320 | */ |
1321 | /* dl_anchor must not be called from multiple threads at once */ | ||
1321 | static int dl_anchor(void) { | 1322 | static int dl_anchor(void) { |
1322 | #if HAVE_DLADDR | 1323 | #if HAVE_DLADDR |
1323 | extern int luaopen__openssl(lua_State *); | 1324 | extern int luaopen__openssl(lua_State *); |
1324 | static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; | ||
1325 | static void *anchor; | 1325 | static void *anchor; |
1326 | Dl_info info; | 1326 | Dl_info info; |
1327 | int error = 0; | 1327 | int error = 0; |
1328 | 1328 | ||
1329 | if ((error = pthread_mutex_lock(&mutex))) | ||
1330 | return error; | ||
1331 | |||
1332 | if (anchor) | 1329 | if (anchor) |
1333 | goto epilog; | 1330 | goto epilog; |
1334 | 1331 | ||
@@ -1338,8 +1335,6 @@ static int dl_anchor(void) { | |||
1338 | if (!(anchor = dlopen(info.dli_fname, RTLD_NOW|RTLD_LOCAL))) | 1335 | if (!(anchor = dlopen(info.dli_fname, RTLD_NOW|RTLD_LOCAL))) |
1339 | goto dlerr; | 1336 | goto dlerr; |
1340 | epilog: | 1337 | epilog: |
1341 | (void)pthread_mutex_unlock(&mutex); | ||
1342 | |||
1343 | return error; | 1338 | return error; |
1344 | dlerr: | 1339 | dlerr: |
1345 | error = auxL_EDYLD; | 1340 | error = auxL_EDYLD; |
@@ -1910,14 +1905,11 @@ static int compat_X509_up_ref(X509 *crt) { | |||
1910 | */ | 1905 | */ |
1911 | #endif | 1906 | #endif |
1912 | 1907 | ||
1908 | /* compat_init must not be called from multiple threads at once */ | ||
1913 | static int compat_init(void) { | 1909 | static int compat_init(void) { |
1914 | static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; | ||
1915 | static int store_index = -1, ssl_ctx_index = -1, done; | 1910 | static int store_index = -1, ssl_ctx_index = -1, done; |
1916 | int error = 0; | 1911 | int error = 0; |
1917 | 1912 | ||
1918 | if ((error = pthread_mutex_lock(&mutex))) | ||
1919 | return error; | ||
1920 | |||
1921 | if (done) | 1913 | if (done) |
1922 | goto epilog; | 1914 | goto epilog; |
1923 | 1915 | ||
@@ -1988,8 +1980,6 @@ epilog: | |||
1988 | compat.tmp.store = NULL; | 1980 | compat.tmp.store = NULL; |
1989 | } | 1981 | } |
1990 | 1982 | ||
1991 | (void)pthread_mutex_unlock(&mutex); | ||
1992 | |||
1993 | return error; | 1983 | return error; |
1994 | sslerr: | 1984 | sslerr: |
1995 | error = auxL_EOPENSSL; | 1985 | error = auxL_EOPENSSL; |
@@ -2115,15 +2105,12 @@ static void ex_onfree(void *parent NOTUSED, void *_data, CRYPTO_EX_DATA *ad NOTU | |||
2115 | free(data); | 2105 | free(data); |
2116 | } /* ex_onfree() */ | 2106 | } /* ex_onfree() */ |
2117 | 2107 | ||
2108 | /* ex_init must not be called from multiple threads at once */ | ||
2118 | static int ex_init(void) { | 2109 | static int ex_init(void) { |
2119 | static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; | ||
2120 | static int done; | 2110 | static int done; |
2121 | struct ex_type *type; | 2111 | struct ex_type *type; |
2122 | int error = 0; | 2112 | int error = 0; |
2123 | 2113 | ||
2124 | if ((error = pthread_mutex_lock(&mutex))) | ||
2125 | return error; | ||
2126 | |||
2127 | if (done) | 2114 | if (done) |
2128 | goto epilog; | 2115 | goto epilog; |
2129 | 2116 | ||
@@ -2144,8 +2131,6 @@ static int ex_init(void) { | |||
2144 | 2131 | ||
2145 | done = 1; | 2132 | done = 1; |
2146 | epilog: | 2133 | epilog: |
2147 | (void)pthread_mutex_unlock(&mutex); | ||
2148 | |||
2149 | return error; | 2134 | return error; |
2150 | sslerr: | 2135 | sslerr: |
2151 | error = auxL_EOPENSSL; | 2136 | error = auxL_EOPENSSL; |
@@ -10435,14 +10420,11 @@ static unsigned long mt_gettid(void) { | |||
10435 | #endif | 10420 | #endif |
10436 | } /* mt_gettid() */ | 10421 | } /* mt_gettid() */ |
10437 | 10422 | ||
10423 | /* mt_init must not be called from multiple threads at once */ | ||
10438 | static int mt_init(void) { | 10424 | static int mt_init(void) { |
10439 | static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; | ||
10440 | static int done, bound; | 10425 | static int done, bound; |
10441 | int error = 0; | 10426 | int error = 0; |
10442 | 10427 | ||
10443 | if ((error = pthread_mutex_lock(&mutex))) | ||
10444 | return error; | ||
10445 | |||
10446 | if (done) | 10428 | if (done) |
10447 | goto epilog; | 10429 | goto epilog; |
10448 | 10430 | ||
@@ -10485,8 +10467,6 @@ static int mt_init(void) { | |||
10485 | 10467 | ||
10486 | done = 1; | 10468 | done = 1; |
10487 | epilog: | 10469 | epilog: |
10488 | pthread_mutex_unlock(&mutex); | ||
10489 | |||
10490 | return error; | 10470 | return error; |
10491 | } /* mt_init() */ | 10471 | } /* mt_init() */ |
10492 | 10472 | ||
@@ -10496,12 +10476,11 @@ static void initall(lua_State *L) { | |||
10496 | static int initssl; | 10476 | static int initssl; |
10497 | int error; | 10477 | int error; |
10498 | 10478 | ||
10499 | if ((error = mt_init())) | ||
10500 | auxL_error(L, error, "openssl.init"); | ||
10501 | |||
10502 | pthread_mutex_lock(&mutex); | 10479 | pthread_mutex_lock(&mutex); |
10503 | 10480 | ||
10504 | if (!initssl) { | 10481 | error = mt_init(); |
10482 | |||
10483 | if (!error && !initssl) { | ||
10505 | initssl = 1; | 10484 | initssl = 1; |
10506 | 10485 | ||
10507 | SSL_load_error_strings(); | 10486 | SSL_load_error_strings(); |
@@ -10515,12 +10494,15 @@ static void initall(lua_State *L) { | |||
10515 | OPENSSL_config(NULL); | 10494 | OPENSSL_config(NULL); |
10516 | } | 10495 | } |
10517 | 10496 | ||
10518 | pthread_mutex_unlock(&mutex); | 10497 | if (!error) |
10498 | error = compat_init(); | ||
10519 | 10499 | ||
10520 | if ((error = compat_init())) | 10500 | if (!error) |
10521 | auxL_error(L, error, "openssl.init"); | 10501 | error = ex_init(); |
10502 | |||
10503 | pthread_mutex_unlock(&mutex); | ||
10522 | 10504 | ||
10523 | if ((error = ex_init())) | 10505 | if (error) |
10524 | auxL_error(L, error, "openssl.init"); | 10506 | auxL_error(L, error, "openssl.init"); |
10525 | 10507 | ||
10526 | ex_newstate(L); | 10508 | ex_newstate(L); |