X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Finit.c;h=a939cb16d462c7d59b8de02f5766deb77e73b20f;hb=3a3f9ed140b0e1feeed1b9655091c270df05332f;hp=35ceb6dc824f00f8db8fbce0e74846fa28a207ea;hpb=4af9f7fe79ff82b90c16969b7e5871435056377b;p=oweals%2Fopenssl.git diff --git a/crypto/init.c b/crypto/init.c index 35ceb6dc82..a939cb16d4 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -81,6 +81,20 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_base) OPENSSL_cpuid_setup(); base_inited = 1; +#ifndef OPENSSL_USE_NODELETE +# ifdef DSO_WIN32 + { + HMODULE handle = NULL; + BOOL ret; + + /* We don't use the DSO route for WIN32 because there is a better way */ + ret = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS + | GET_MODULE_HANDLE_EX_FLAG_PIN, + (void *)&base_inited, &handle); + + return (ret == TRUE) ? 1 : 0; + } +# else /* * Deliberately leak a reference to ourselves. This will force the library * to remain loaded until the atexit() handler is run a process exit. @@ -91,6 +105,8 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_base) dso = DSO_dsobyaddr(&base_inited, DSO_FLAG_NO_UNLOAD_ON_FREE); DSO_free(dso); } +# endif +#endif return 1; } @@ -588,23 +604,46 @@ int OPENSSL_atexit(void (*handler)(void)) { OPENSSL_INIT_STOP *newhand; - /* - * Deliberately leak a reference to the handler. This will force the - * library/code containing the handler to remain loaded until we run the - * atexit handler. - */ +#ifndef OPENSSL_USE_NODELETE { - DSO *dso = NULL; union { void *sym; void (*func)(void); } handlersym; handlersym.func = handler; +# ifdef DSO_WIN32 + { + HMODULE handle = NULL; + BOOL ret; - dso = DSO_dsobyaddr(handlersym.sym, DSO_FLAG_NO_UNLOAD_ON_FREE); - DSO_free(dso); + /* + * We don't use the DSO route for WIN32 because there is a better + * way + */ + ret = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS + | GET_MODULE_HANDLE_EX_FLAG_PIN, + handlersym.sym, &handle); + + if (!ret) + return 0; + } +# else + /* + * Deliberately leak a reference to the handler. This will force the + * library/code containing the handler to remain loaded until we run the + * atexit handler. If -znodelete has been used then this is + * unneccessary. + */ + { + DSO *dso = NULL; + + dso = DSO_dsobyaddr(handlersym.sym, DSO_FLAG_NO_UNLOAD_ON_FREE); + DSO_free(dso); + } +# endif } +#endif newhand = OPENSSL_malloc(sizeof(*newhand)); if (newhand == NULL)