global_init: undo the "intialized" bump in case of failure

... so that failures in the global init function don't count as a
working init and it can then be called again.

Reported-by: Paul Groke
Fixes #4636
Closes #4653
This commit is contained in:
Daniel Stenberg 2019-11-28 16:21:58 +01:00
parent 0044443a02
commit bc5d22c3de
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -157,20 +157,20 @@ static CURLcode global_init(long flags, bool memoryfuncs)
if(!Curl_ssl_init()) { if(!Curl_ssl_init()) {
DEBUGF(fprintf(stderr, "Error: Curl_ssl_init failed\n")); DEBUGF(fprintf(stderr, "Error: Curl_ssl_init failed\n"));
return CURLE_FAILED_INIT; goto fail;
} }
#ifdef WIN32 #ifdef WIN32
if(Curl_win32_init(flags)) { if(Curl_win32_init(flags)) {
DEBUGF(fprintf(stderr, "Error: win32_init failed\n")); DEBUGF(fprintf(stderr, "Error: win32_init failed\n"));
return CURLE_FAILED_INIT; goto fail;
} }
#endif #endif
#ifdef __AMIGA__ #ifdef __AMIGA__
if(!Curl_amiga_init()) { if(!Curl_amiga_init()) {
DEBUGF(fprintf(stderr, "Error: Curl_amiga_init failed\n")); DEBUGF(fprintf(stderr, "Error: Curl_amiga_init failed\n"));
return CURLE_FAILED_INIT; goto fail;
} }
#endif #endif
@ -182,14 +182,14 @@ static CURLcode global_init(long flags, bool memoryfuncs)
if(Curl_resolver_global_init()) { if(Curl_resolver_global_init()) {
DEBUGF(fprintf(stderr, "Error: resolver_global_init failed\n")); DEBUGF(fprintf(stderr, "Error: resolver_global_init failed\n"));
return CURLE_FAILED_INIT; goto fail;
} }
(void)Curl_ipv6works(); (void)Curl_ipv6works();
#if defined(USE_SSH) #if defined(USE_SSH)
if(Curl_ssh_init()) { if(Curl_ssh_init()) {
return CURLE_FAILED_INIT; goto fail;
} }
#endif #endif
@ -201,6 +201,10 @@ static CURLcode global_init(long flags, bool memoryfuncs)
Curl_version_init(); Curl_version_init();
return CURLE_OK; return CURLE_OK;
fail:
initialized--; /* undo the increase */
return CURLE_FAILED_INIT;
} }