From: Matt Caswell Date: Fri, 16 Nov 2018 17:26:23 +0000 (+0000) Subject: Support _onexit() in preference to atexit() on Windows X-Git-Tag: OpenSSL_1_1_1b~94 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=56806f432b6c0cabbc46ebcdf6a9a6009489c0c0;p=oweals%2Fopenssl.git Support _onexit() in preference to atexit() on Windows This enables cleanup to happen on DLL unload instead of at process exit. [extended tests] Reviewed-by: Tim Hudson (Merged from https://github.com/openssl/openssl/pull/7983) --- diff --git a/crypto/init.c b/crypto/init.c index 1c50f2994e..46ba67d3e4 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -118,14 +118,28 @@ err: } static CRYPTO_ONCE register_atexit = CRYPTO_ONCE_STATIC_INIT; +#if !defined(OPENSSL_SYS_UEFI) && defined(_WIN32) +static int win32atexit(void) +{ + OPENSSL_cleanup(); + return 0; +} +#endif + DEFINE_RUN_ONCE_STATIC(ossl_init_register_atexit) { -# ifdef OPENSSL_INIT_DEBUG +#ifdef OPENSSL_INIT_DEBUG fprintf(stderr, "OPENSSL_INIT: ossl_init_register_atexit()\n"); -# endif +#endif #ifndef OPENSSL_SYS_UEFI +# ifdef _WIN32 + /* We use _onexit() in preference because it gets called on DLL unload */ + if (_onexit(win32atexit) == NULL) + return 0; +# else if (atexit(OPENSSL_cleanup) != 0) return 0; +# endif #endif return 1;