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 */