Alexandre Julliard : ntdll: Better handling of errors when loading a builtin dll from an

Alexandre Julliard julliard at wine.codeweavers.com
Thu Feb 9 05:47:43 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 69089152d136cbac78ababc007d9a4bcf64e0830
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=69089152d136cbac78ababc007d9a4bcf64e0830

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Feb  9 12:15:57 2006 +0100

ntdll: Better handling of errors when loading a builtin dll from an
existing file.

---

 dlls/ntdll/loader.c |   47 +++++++++++++++++++++++++++--------------------
 1 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index d4e946a..00817ff 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -1427,7 +1427,6 @@ static NTSTATUS load_builtin_dll( LPCWST
                                   DWORD flags, WINE_MODREF** pwm )
 {
     char error[256], dllname[MAX_PATH];
-    int file_exists;
     const WCHAR *name, *p;
     DWORD len, i;
     void *handle = NULL;
@@ -1456,20 +1455,28 @@ static NTSTATUS load_builtin_dll( LPCWST
         if (!RtlDosPathNameToNtPathName_U( path, &nt_name, NULL, NULL ))
             return STATUS_DLL_NOT_FOUND;
 
-        if (!wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN, FALSE ))
+        if (wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN, FALSE ))
         {
-            file_exists = 1;
-            prev_info = builtin_load_info;
-            info.filename = nt_name.Buffer + 4;  /* skip \??\ */
-            builtin_load_info = &info;
-            handle = wine_dlopen( unix_name.Buffer, RTLD_NOW, error, sizeof(error) );
-            builtin_load_info = prev_info;
-            RtlFreeHeap( GetProcessHeap(), 0, unix_name.Buffer );
+            RtlFreeUnicodeString( &nt_name );
+            return STATUS_DLL_NOT_FOUND;
         }
+        prev_info = builtin_load_info;
+        info.filename = nt_name.Buffer + 4;  /* skip \??\ */
+        builtin_load_info = &info;
+        handle = wine_dlopen( unix_name.Buffer, RTLD_NOW, error, sizeof(error) );
+        builtin_load_info = prev_info;
         RtlFreeUnicodeString( &nt_name );
+        RtlFreeHeap( GetProcessHeap(), 0, unix_name.Buffer );
+        if (!handle)
+        {
+            WARN( "failed to load .so lib for builtin %s: %s\n", debugstr_w(path), error );
+            return STATUS_INVALID_IMAGE_FORMAT;
+        }
     }
     else
     {
+        int file_exists;
+
         /* we don't want to depend on the current codepage here */
         len = strlenW( name ) + 1;
         if (len >= sizeof(dllname)) return STATUS_NAME_TOO_LONG;
@@ -1484,20 +1491,20 @@ static NTSTATUS load_builtin_dll( LPCWST
         builtin_load_info = &info;
         handle = wine_dll_load( dllname, error, sizeof(error), &file_exists );
         builtin_load_info = prev_info;
-    }
-
-    if (!handle)
-    {
-        if (!file_exists)
+        if (!handle)
         {
-            /* The file does not exist -> WARN() */
-            WARN("cannot open .so lib for builtin %s: %s\n", debugstr_w(name), error);
-            return STATUS_DLL_NOT_FOUND;
+            if (!file_exists)
+            {
+                /* The file does not exist -> WARN() */
+                WARN("cannot open .so lib for builtin %s: %s\n", debugstr_w(name), error);
+                return STATUS_DLL_NOT_FOUND;
+            }
+            /* ERR() for all other errors (missing functions, ...) */
+            ERR("failed to load .so lib for builtin %s: %s\n", debugstr_w(name), error );
+            return STATUS_PROCEDURE_NOT_FOUND;
         }
-        /* ERR() for all other errors (missing functions, ...) */
-        ERR("failed to load .so lib for builtin %s: %s\n", debugstr_w(name), error );
-        return STATUS_PROCEDURE_NOT_FOUND;
     }
+
     if (info.status != STATUS_SUCCESS) return info.status;
 
     if (!info.wm)




More information about the wine-cvs mailing list