diff options
author | 2018-03-07 17:17:47 +0000 | |
---|---|---|
committer | 2018-03-07 17:17:47 +0000 | |
commit | 62f07b25bdd968b3fd75b30b4d3f23fe17e878b2 (patch) | |
tree | c7db06d6d7ec271a87f5e2a8cefb36793ce6304b | |
parent | add "int stall" argument required by filesystem stall code; from Tomohiro Kusumi (diff) | |
download | wireguard-openbsd-62f07b25bdd968b3fd75b30b4d3f23fe17e878b2.tar.xz wireguard-openbsd-62f07b25bdd968b3fd75b30b4d3f23fe17e878b2.zip |
Make tls_init() concurrently callable using pthread_once().
ok jsing@
This brings pthread_once usage into libressl, which will
need to get dealt with correctly in portable.
This sets us up to autoinit libtls, and we will also be
using pthread_once to deal with autoinit stuff in libssl
and libcrypto
-rw-r--r-- | lib/libtls/man/tls_init.3 | 6 | ||||
-rw-r--r-- | lib/libtls/tls.c | 32 |
2 files changed, 23 insertions, 15 deletions
diff --git a/lib/libtls/man/tls_init.3 b/lib/libtls/man/tls_init.3 index c83c0375abe..fe8847d0acd 100644 --- a/lib/libtls/man/tls_init.3 +++ b/lib/libtls/man/tls_init.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tls_init.3,v 1.7 2017/05/06 21:18:48 jsing Exp $ +.\" $OpenBSD: tls_init.3,v 1.8 2018/03/07 17:17:47 beck Exp $ .\" .\" Copyright (c) 2014 Ted Unangst <tedu@openbsd.org> .\" Copyright (c) 2016 Joel Sing <jsing@openbsd.org> @@ -16,7 +16,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: May 6 2017 $ +.Dd $Mdocdate: March 7 2018 $ .Dt TLS_INIT 3 .Os .Sh NAME @@ -46,7 +46,7 @@ The .Fn tls_init function initializes global data structures. It should be called once before any other functions. -It may be called more than once, but not concurrently. +It may be called more than once, and may be called concurrently. .Pp Before a connection is created, a configuration must be created. The diff --git a/lib/libtls/tls.c b/lib/libtls/tls.c index 8f2c7dde057..4a9db289bd6 100644 --- a/lib/libtls/tls.c +++ b/lib/libtls/tls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tls.c,v 1.75 2018/02/10 04:57:35 jsing Exp $ */ +/* $OpenBSD: tls.c,v 1.76 2018/03/07 17:17:47 beck Exp $ */ /* * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> * @@ -19,6 +19,7 @@ #include <errno.h> #include <limits.h> +#include <pthread.h> #include <stdlib.h> #include <unistd.h> @@ -35,28 +36,35 @@ static struct tls_config *tls_config_default; -int -tls_init(void) -{ - static int tls_initialised = 0; - - if (tls_initialised) - return (0); +static int tls_init_rv = -1; +static void +tls_do_init(void) +{ SSL_load_error_strings(); SSL_library_init(); if (BIO_sock_init() != 1) - return (-1); + return; if ((tls_config_default = tls_config_new()) == NULL) - return (-1); + return; tls_config_default->refcount++; - tls_initialised = 1; + tls_init_rv = 0; + return; +} - return (0); +int +tls_init(void) +{ + static pthread_once_t once = PTHREAD_ONCE_INIT; + + if (pthread_once(&once, tls_do_init) != 0) + return -1; + + return tls_init_rv; } const char * |