From ed9ddb3c569bee22bea07d606e5f70d38cf4395d Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Tue, 19 May 2009 17:25:08 +0000 Subject: [PATCH] Tue May 19 12:00:30 CDT 2009 Pekka Pessi * su_uniqueid.c: Solaris misdefines PTHREAD_ONCE_INIT Ignore-this: 9fe2247164d572901ed4a30b009353db Solaris defines pthread_once_t as a struct containing an array. The initializer PTHREAD_ONCE_INIT needs two levels of brackets it but only has one. Original patch from Mike Jerris . git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@13388 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- libs/sofia-sip/.update | 2 +- .../libsofia-sip-ua/tport/tport_tls.c | 39 +++++++++++++++---- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index 902eb06483..f624244fd2 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Tue May 19 12:23:01 CDT 2009 +Tue May 19 12:24:21 CDT 2009 diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/tport_tls.c b/libs/sofia-sip/libsofia-sip-ua/tport/tport_tls.c index 0ab4476246..25f9e79b8b 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/tport_tls.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/tport_tls.c @@ -68,11 +68,38 @@ static char const __func__[] = "tport_tls"; #include #endif +#if SU_HAVE_PTHREADS + +#include + +#if __sun +#undef PTHREAD_ONCE_INIT +#define PTHREAD_ONCE_INIT {{ 0, 0, 0, PTHREAD_ONCE_NOTDONE }} +#endif + +static pthread_once_t once = PTHREAD_ONCE_INIT; +#define ONCE_INIT(f) pthread_once(&once, f) + +#else + +static int once; +#define ONCE_INIT(f) (!once ? (once = 1), f() : (void)0) + +#endif + #include "tport_tls.h" char const tls_version[] = OPENSSL_VERSION_TEXT; int tls_ex_data_idx = -1; /* see SSL_get_ex_new_index(3ssl) */ +static void +tls_init_once(void) +{ + SSL_library_init(); + SSL_load_error_strings(); + tls_ex_data_idx = SSL_get_ex_new_index(0, "sofia-sip private data", NULL, NULL, NULL); +} + enum { tls_master = 0, tls_slave = 1}; struct tls_s { @@ -218,15 +245,13 @@ int tls_verify_cb(int ok, X509_STORE_CTX *store) static int tls_init_context(tls_t *tls, tls_issues_t const *ti) { - static int initialized = 0; int verify; + static int random_loaded; - if (!initialized) { - initialized = 1; - SSL_library_init(); - SSL_load_error_strings(); - tls_ex_data_idx = SSL_get_ex_new_index(0, \ - "sofia-sip private data", NULL, NULL, NULL); + ONCE_INIT(tls_init_once); + + if (!random_loaded) { + random_loaded = 1; if (ti->randFile && !RAND_load_file(ti->randFile, 1024 * 1024)) {