mirror of
https://github.com/openssl/openssl.git
synced 2024-12-20 07:23:54 +08:00
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>
This commit is contained in:
parent
b6d5ba1a9f
commit
2b59d1beaa
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user