Bugfix: When loading an executable module fails, don't perform module
cleanup before the corresponding task is destroyed.
diff --git a/loader/ne/module.c b/loader/ne/module.c
index 7a79201..5b7ebb2 100644
--- a/loader/ne/module.c
+++ b/loader/ne/module.c
@@ -797,18 +797,12 @@
if (!NE_CreateSegments( pModule ) ||
!(hInstance = NE_CreateInstance( pModule, NULL, FALSE )))
- {
- GlobalFreeAll16( pModule->self );
return 8; /* Insufficient memory */
- }
/* Load the referenced DLLs */
if (!NE_LoadDLLs( pModule ))
- {
- NE_FreeModule( pModule->self, 0 );
return 2;
- }
/* Load the segments */
@@ -845,6 +839,7 @@
{
NE_MODULE *pModule;
HMODULE16 hModule;
+ HINSTANCE16 hInstance;
HFILE16 hFile;
OFSTRUCT ofs;
@@ -872,7 +867,14 @@
if ( !lib_only && !( pModule->flags & NE_FFLAGS_LIBMODULE ) )
return hModule;
- return NE_DoLoadModule( pModule );
+ hInstance = NE_DoLoadModule( pModule );
+ if ( hInstance < 32 )
+ {
+ /* cleanup ... */
+ NE_FreeModule( hModule, 0 );
+ }
+
+ return hInstance;
}
@@ -1179,12 +1181,14 @@
hInstance = NE_DoLoadModule( pModule );
hPrevInstance = 0;
+ }
- if ( hInstance < 32 )
- {
- SetLastError( hInstance );
- retv = FALSE;
- }
+ if ( hInstance < 32 )
+ {
+ SYSLEVEL_LeaveWin16Lock();
+
+ SetLastError( hInstance );
+ return FALSE;
}
/* Enter instance handles into task struct */