diff options
author | Matt Caswell <matt@openssl.org> | 2016-10-28 11:03:22 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2016-11-02 23:38:20 +0000 |
commit | 2e6b83f608b7a4b315146895ac911e8c06d40db1 (patch) | |
tree | 231e52f6eec5adf271809ada136d0e8d2895cc30 /crypto | |
parent | 848dc9619049f6aaad91b367eed309d987009e5e (diff) |
Implement GET_MODULE_HANDLE_EX_FLAG_PIN for windows
Rather than leaking a reference, just call GetModuleHandleEx and pin the
module on Windows.
Reviewed-by: Tim Hudson <tjh@openssl.org>
(cherry picked from commit 2b59d1beaad43d9cf8eb916a437db63bc8ce1d3a)
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/init.c | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/crypto/init.c b/crypto/init.c index 30c261588a..a939cb16d4 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -82,6 +82,19 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_base) 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. @@ -92,6 +105,7 @@ 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; @@ -591,22 +605,43 @@ int OPENSSL_atexit(void (*handler)(void)) OPENSSL_INIT_STOP *newhand; #ifndef OPENSSL_USE_NODELETE - /* - * 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; 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 |