From 80015cdd52145bd95b98e0e456540c6da3120f98 Mon Sep 17 00:00:00 2001 From: Jay Satiro Date: Wed, 16 Mar 2016 19:13:42 -0400 Subject: version: thread safety --- lib/version.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'lib/version.c') 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; } -- cgit v1.2.3