From 80015cdd52145bd95b98e0e456540c6da3120f98 Mon Sep 17 00:00:00 2001 From: Jay Satiro Date: Wed, 16 Mar 2016 19:13:42 -0400 Subject: [PATCH] version: thread safety --- lib/easy.c | 6 +++++- lib/version.c | 22 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/easy.c b/lib/easy.c index fc7b40b27..0b6d93361 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -79,6 +79,8 @@ #include "curl_memory.h" #include "memdebug.h" +void curl_version_init(); + /* win32_cleanup() is for win32 socket cleanup functionality, the opposite of win32_init() */ static void win32_cleanup(void) @@ -280,7 +282,9 @@ static CURLcode global_init(long flags, bool memoryfuncs) if(flags & CURL_GLOBAL_ACK_EINTR) Curl_ack_eintr = 1; - init_flags = flags; + init_flags = flags; + + curl_version_init(); return CURLE_OK; } diff --git a/lib/version.c b/lib/version.c index 7f14fa5ca..f693feeda 100644 --- a/lib/version.c +++ b/lib/version.c @@ -64,13 +64,25 @@ #define CURL_LIBSSH2_VERSION LIBSSH2_VERSION #endif +/* For thread safety purposes this function is called by global_init so that + the static data in both version functions is initialized. */ +void curl_version_init() +{ + curl_version(); + curl_version_info(CURLVERSION_NOW); +} + char *curl_version(void) { + static bool initialized; static char version[200]; char *ptr = version; size_t len; size_t left = sizeof(version); + if(initialized) + return version; + strcpy(ptr, LIBCURL_NAME "/" LIBCURL_VERSION); len = strlen(ptr); left -= len; @@ -160,6 +172,7 @@ char *curl_version(void) } #endif + initialized = true; return version; } @@ -323,12 +336,18 @@ static curl_version_info_data version_info = { curl_version_info_data *curl_version_info(CURLversion stamp) { + static bool initialized; #ifdef USE_LIBSSH2 static char ssh_buffer[80]; #endif - #ifdef USE_SSL static char ssl_buffer[80]; +#endif + + if(initialized) + return &version_info; + +#ifdef USE_SSL Curl_ssl_version(ssl_buffer, sizeof(ssl_buffer)); version_info.ssl_version = ssl_buffer; #endif @@ -370,5 +389,6 @@ curl_version_info_data *curl_version_info(CURLversion stamp) (void)stamp; /* avoid compiler warnings, we don't use this */ + initialized = true; return &version_info; }