mirror of
https://github.com/solemnwarning/ipxwrapper
synced 2024-12-30 16:45:37 +01:00
Don't do any cleanup in DllMain() during process termination.
Subtle crashes are fun. I found this to cause a deadlock, but only after adding lots of extra debug logging to diagnose a DIFFERENT bug and only when running it on a particular machine. But once both of those criteria are met? It crashes pretty reliably.
This commit is contained in:
parent
d65fb92480
commit
4cdca80c4b
@ -722,15 +722,25 @@ HRESULT WINAPI SPInit(LPSPINITDATA data) {
|
|||||||
return DPERR_UNAVAILABLE;
|
return DPERR_UNAVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WINAPI DllMain(HINSTANCE me, DWORD why, LPVOID res) {
|
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
|
||||||
if(why == DLL_PROCESS_ATTACH)
|
if(fdwReason == DLL_PROCESS_ATTACH)
|
||||||
{
|
{
|
||||||
log_open("ipxwrapper.log");
|
log_open("ipxwrapper.log");
|
||||||
|
|
||||||
min_log_level = get_main_config().log_level;
|
min_log_level = get_main_config().log_level;
|
||||||
}
|
}
|
||||||
else if(why == DLL_PROCESS_DETACH)
|
else if(fdwReason == DLL_PROCESS_DETACH)
|
||||||
{
|
{
|
||||||
|
/* When the "lpvReserved" parameter is non-NULL, the process is terminating rather
|
||||||
|
* than the DLL being unloaded dynamically and any threads will have been terminated
|
||||||
|
* at unknown points, meaning any global data may be in an inconsistent state and we
|
||||||
|
* cannot (safely) clean up. MSDN states we should do nothing.
|
||||||
|
*/
|
||||||
|
if(lpvReserved != NULL)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
unload_dlls();
|
unload_dlls();
|
||||||
log_close();
|
log_close();
|
||||||
}
|
}
|
||||||
|
@ -59,9 +59,9 @@ static void init_cs(CRITICAL_SECTION *cs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WINAPI DllMain(HINSTANCE me, DWORD why, LPVOID res)
|
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
{
|
{
|
||||||
if(why == DLL_PROCESS_ATTACH)
|
if(fdwReason == DLL_PROCESS_ATTACH)
|
||||||
{
|
{
|
||||||
log_open("ipxwrapper.log");
|
log_open("ipxwrapper.log");
|
||||||
|
|
||||||
@ -105,8 +105,18 @@ BOOL WINAPI DllMain(HINSTANCE me, DWORD why, LPVOID res)
|
|||||||
|
|
||||||
router_init();
|
router_init();
|
||||||
}
|
}
|
||||||
else if(why == DLL_PROCESS_DETACH)
|
else if(fdwReason == DLL_PROCESS_DETACH)
|
||||||
{
|
{
|
||||||
|
/* When the "lpvReserved" parameter is non-NULL, the process is terminating rather
|
||||||
|
* than the DLL being unloaded dynamically and any threads will have been terminated
|
||||||
|
* at unknown points, meaning any global data may be in an inconsistent state and we
|
||||||
|
* cannot (safely) clean up. MSDN states we should do nothing.
|
||||||
|
*/
|
||||||
|
if(lpvReserved != NULL)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
router_cleanup();
|
router_cleanup();
|
||||||
|
|
||||||
WSACleanup();
|
WSACleanup();
|
||||||
|
@ -22,15 +22,25 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
BOOL WINAPI DllMain(HINSTANCE me, DWORD why, LPVOID res) {
|
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
|
||||||
if(why == DLL_PROCESS_ATTACH)
|
if(fdwReason == DLL_PROCESS_ATTACH)
|
||||||
{
|
{
|
||||||
log_open("ipxwrapper.log");
|
log_open("ipxwrapper.log");
|
||||||
|
|
||||||
min_log_level = get_main_config().log_level;
|
min_log_level = get_main_config().log_level;
|
||||||
}
|
}
|
||||||
else if(why == DLL_PROCESS_DETACH)
|
else if(fdwReason == DLL_PROCESS_DETACH)
|
||||||
{
|
{
|
||||||
|
/* When the "lpvReserved" parameter is non-NULL, the process is terminating rather
|
||||||
|
* than the DLL being unloaded dynamically and any threads will have been terminated
|
||||||
|
* at unknown points, meaning any global data may be in an inconsistent state and we
|
||||||
|
* cannot (safely) clean up. MSDN states we should do nothing.
|
||||||
|
*/
|
||||||
|
if(lpvReserved != NULL)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
unload_dlls();
|
unload_dlls();
|
||||||
log_close();
|
log_close();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user