Alexandre Julliard : ntdll: Check for valid architecture before mapping the module.

Alexandre Julliard julliard at winehq.org
Mon Jan 25 16:42:05 CST 2021


Module: wine
Branch: master
Commit: 63b62953683fc62e95d5df8cb975009554aff1a3
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=63b62953683fc62e95d5df8cb975009554aff1a3

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jan 21 13:41:16 2021 +0100

ntdll: Check for valid architecture before mapping the module.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/loader.c      | 33 ++++++++++++++++-----------------
 dlls/ntdll/unix/loader.c | 43 +++++++++++++++++++++++--------------------
 2 files changed, 39 insertions(+), 37 deletions(-)

diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index fa757fefa90..fec33c8017c 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -1985,6 +1985,8 @@ static BOOL convert_to_pe64( HMODULE module, const SECTION_IMAGE_INFORMATION *in
     void *addr = module;
     ULONG i, old_prot;
 
+    if (nt->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) return TRUE;  /* already 64-bit */
+
     TRACE( "%p\n", module );
 
     if (NtProtectVirtualMemory( NtCurrentProcess(), &addr, &size, PAGE_READWRITE, &old_prot ))
@@ -2304,34 +2306,31 @@ static NTSTATUS open_dll_file( UNICODE_STRING *nt_name, WINE_MODREF **pwm, void
                               SECTION_MAP_READ | SECTION_MAP_EXECUTE,
                               NULL, &size, PAGE_EXECUTE_READ, SEC_IMAGE, handle );
     if (!status)
+    {
+        NtQuerySection( mapping, SectionImageInformation, image_info, sizeof(*image_info), NULL );
+        if (!is_valid_binary( handle, image_info ))
+        {
+            TRACE( "%s is for arch %x, continuing search\n", debugstr_us(nt_name), image_info->Machine );
+            status = STATUS_IMAGE_MACHINE_TYPE_MISMATCH;
+            NtClose( mapping );
+        }
+    }
+    NtClose( handle );
+    if (!status)
     {
         if (*module)
         {
             NtUnmapViewOfSection( NtCurrentProcess(), *module );
             *module = NULL;
         }
-        NtQuerySection( mapping, SectionImageInformation, image_info, sizeof(*image_info), NULL );
         status = NtMapViewOfSection( mapping, NtCurrentProcess(), module, 0, 0, NULL, &len,
                                      ViewShare, 0, PAGE_EXECUTE_READ );
         if (status == STATUS_IMAGE_NOT_AT_BASE) status = STATUS_SUCCESS;
-        NtClose( mapping );
-    }
-    if (!status && !is_valid_binary( handle, image_info ))
-    {
-        TRACE( "%s is for arch %x, continuing search\n", debugstr_us(nt_name), image_info->Machine );
-        NtUnmapViewOfSection( NtCurrentProcess(), *module );
-        *module = NULL;
-        status = STATUS_IMAGE_MACHINE_TYPE_MISMATCH;
-    }
 #ifdef _WIN64
-    if (!status &&
-        image_info->Machine != IMAGE_FILE_MACHINE_AMD64 &&
-        image_info->Machine != IMAGE_FILE_MACHINE_ARM64)
-    {
-        if (!convert_to_pe64( *module, image_info )) status = STATUS_INVALID_IMAGE_FORMAT;
-    }
+        if (!status && !convert_to_pe64( *module, image_info )) status = STATUS_INVALID_IMAGE_FORMAT;
 #endif
-    NtClose( handle );
+        NtClose( mapping );
+    }
     return status;
 }
 
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 43c769f2d2a..972793ac3e9 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -1077,7 +1077,7 @@ static NTSTATUS CDECL load_so_dll( UNICODE_STRING *nt_name, void **module )
 
 
 /* check a PE library architecture */
-static BOOL is_valid_binary( HMODULE module, const SECTION_IMAGE_INFORMATION *info )
+static BOOL is_valid_binary( const SECTION_IMAGE_INFORMATION *info )
 {
 #ifdef __i386__
     return info->Machine == IMAGE_FILE_MACHINE_I386;
@@ -1138,7 +1138,7 @@ static inline char *prepend( char *buffer, const char *str, size_t len )
 /***********************************************************************
  *	open_dll_file
  *
- * Open a file for a new dll. Helper for find_dll_file.
+ * Open a file for a new dll. Helper for open_builtin_file.
  */
 static NTSTATUS open_dll_file( const char *name, void **module, SECTION_IMAGE_INFORMATION *image_info )
 {
@@ -1187,37 +1187,40 @@ static NTSTATUS open_dll_file( const char *name, void **module, SECTION_IMAGE_IN
     NtClose( handle );
     if (status) return status;
 
-    if (*module)
-    {
-        NtUnmapViewOfSection( NtCurrentProcess(), *module );
-        *module = NULL;
-    }
     NtQuerySection( mapping, SectionImageInformation, image_info, sizeof(*image_info), NULL );
-    status = NtMapViewOfSection( mapping, NtCurrentProcess(), module, 0, 0, NULL, &len,
-                                 ViewShare, 0, PAGE_EXECUTE_READ );
-    if (status == STATUS_IMAGE_NOT_AT_BASE) status = STATUS_SUCCESS;
-    NtClose( mapping );
-    if (status) return status;
-
     /* ignore non-builtins */
     if (!(image_info->u.ImageFlags & IMAGE_FLAGS_WineBuiltin))
     {
         WARN( "%s found in WINEDLLPATH but not a builtin, ignoring\n", debugstr_a(name) );
         status = STATUS_DLL_NOT_FOUND;
     }
-    else if (!is_valid_binary( *module, image_info ))
+    else if (!is_valid_binary( image_info ))
     {
         TRACE( "%s is for arch %x, continuing search\n", debugstr_a(name), image_info->Machine );
         status = STATUS_IMAGE_MACHINE_TYPE_MISMATCH;
     }
-
-    if (!status) status = add_builtin_module( *module, NULL, &st );
-
-    if (status)
+    else
     {
-        NtUnmapViewOfSection( NtCurrentProcess(), *module );
-        *module = NULL;
+        if (*module)
+        {
+            NtUnmapViewOfSection( NtCurrentProcess(), *module );
+            *module = NULL;
+        }
+        status = NtMapViewOfSection( mapping, NtCurrentProcess(), module, 0, 0, NULL, &len,
+                                     ViewShare, 0, PAGE_EXECUTE_READ );
+        if (status == STATUS_IMAGE_NOT_AT_BASE) status = STATUS_SUCCESS;
+
+        if (!status)
+        {
+            status = add_builtin_module( *module, NULL, &st );
+            if (status)
+            {
+                NtUnmapViewOfSection( NtCurrentProcess(), *module );
+                *module = NULL;
+            }
+        }
     }
+    NtClose( mapping );
     return status;
 }
 




More information about the wine-cvs mailing list