summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbeck <>2018-03-07 17:17:47 +0000
committerbeck <>2018-03-07 17:17:47 +0000
commite6135660e4e7cb53ac89d814a7cfe8e97df34068 (patch)
tree522fdc4aeaca648a24322ae67565db878e5113bc
parent8499f4be87aaffec67d6c3aaf62d18a847e4a6ff (diff)
downloadopenbsd-e6135660e4e7cb53ac89d814a7cfe8e97df34068.tar.gz
openbsd-e6135660e4e7cb53ac89d814a7cfe8e97df34068.tar.bz2
openbsd-e6135660e4e7cb53ac89d814a7cfe8e97df34068.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--src/lib/libtls/man/tls_init.36
-rw-r--r--src/lib/libtls/tls.c32
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 @@
1.\" $OpenBSD: tls_init.3,v 1.7 2017/05/06 21:18:48 jsing Exp $ 1.\" $OpenBSD: tls_init.3,v 1.8 2018/03/07 17:17:47 beck Exp $
2.\" 2.\"
3.\" Copyright (c) 2014 Ted Unangst <tedu@openbsd.org> 3.\" Copyright (c) 2014 Ted Unangst <tedu@openbsd.org>
4.\" Copyright (c) 2016 Joel Sing <jsing@openbsd.org> 4.\" Copyright (c) 2016 Joel Sing <jsing@openbsd.org>
@@ -16,7 +16,7 @@
16.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18.\" 18.\"
19.Dd $Mdocdate: May 6 2017 $ 19.Dd $Mdocdate: March 7 2018 $
20.Dt TLS_INIT 3 20.Dt TLS_INIT 3
21.Os 21.Os
22.Sh NAME 22.Sh NAME
@@ -46,7 +46,7 @@ The
46.Fn tls_init 46.Fn tls_init
47function initializes global data structures. 47function initializes global data structures.
48It should be called once before any other functions. 48It should be called once before any other functions.
49It may be called more than once, but not concurrently. 49It may be called more than once, and may be called concurrently.
50.Pp 50.Pp
51Before a connection is created, a configuration must be created. 51Before a connection is created, a configuration must be created.
52The 52The
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 @@
1/* $OpenBSD: tls.c,v 1.75 2018/02/10 04:57:35 jsing Exp $ */ 1/* $OpenBSD: tls.c,v 1.76 2018/03/07 17:17:47 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -19,6 +19,7 @@
19 19
20#include <errno.h> 20#include <errno.h>
21#include <limits.h> 21#include <limits.h>
22#include <pthread.h>
22#include <stdlib.h> 23#include <stdlib.h>
23#include <unistd.h> 24#include <unistd.h>
24 25
@@ -35,28 +36,35 @@
35 36
36static struct tls_config *tls_config_default; 37static struct tls_config *tls_config_default;
37 38
38int 39static int tls_init_rv = -1;
39tls_init(void)
40{
41 static int tls_initialised = 0;
42
43 if (tls_initialised)
44 return (0);
45 40
41static void
42tls_do_init(void)
43{
46 SSL_load_error_strings(); 44 SSL_load_error_strings();
47 SSL_library_init(); 45 SSL_library_init();
48 46
49 if (BIO_sock_init() != 1) 47 if (BIO_sock_init() != 1)
50 return (-1); 48 return;
51 49
52 if ((tls_config_default = tls_config_new()) == NULL) 50 if ((tls_config_default = tls_config_new()) == NULL)
53 return (-1); 51 return;
54 52
55 tls_config_default->refcount++; 53 tls_config_default->refcount++;
56 54
57 tls_initialised = 1; 55 tls_init_rv = 0;
56 return;
57}
58 58
59 return (0); 59int
60tls_init(void)
61{
62 static pthread_once_t once = PTHREAD_ONCE_INIT;
63
64 if (pthread_once(&once, tls_do_init) != 0)
65 return -1;
66
67 return tls_init_rv;
60} 68}
61 69
62const char * 70const char *