From e6135660e4e7cb53ac89d814a7cfe8e97df34068 Mon Sep 17 00:00:00 2001 From: beck <> Date: Wed, 7 Mar 2018 17:17:47 +0000 Subject: 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 --- src/lib/libtls/man/tls_init.3 | 6 +++--- src/lib/libtls/tls.c | 32 ++++++++++++++++++++------------ 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/lib/libtls/man/tls_init.3 b/src/lib/libtls/man/tls_init.3 index c83c0375ab..fe8847d0ac 100644 --- a/src/lib/libtls/man/tls_init.3 +++ b/src/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 .\" Copyright (c) 2016 Joel Sing @@ -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/src/lib/libtls/tls.c b/src/lib/libtls/tls.c index 8f2c7dde05..4a9db289bd 100644 --- a/src/lib/libtls/tls.c +++ b/src/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 * @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -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 * -- cgit v1.2.3-55-g6feb