[PATCH 3/4] ntdll: Set address to NULL on error in LdrGetProcedureAddress

Alex Henrie alexhenrie24 at gmail.com
Sun Jun 7 23:41:18 CDT 2020


Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
 dlls/ntdll/loader.c    |  2 ++
 dlls/ntdll/tests/rtl.c | 23 +++++++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 63972f360f..d1b71efc07 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -1845,6 +1845,8 @@ NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE module, const ANSI_STRING *name,
     DWORD exp_size;
     NTSTATUS ret = STATUS_PROCEDURE_NOT_FOUND;
 
+    *address = NULL;
+
     RtlEnterCriticalSection( &loader_section );
 
     /* check if the module itself is invalid to return the proper error */
diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c
index f3ed4100c1..fb90de6785 100644
--- a/dlls/ntdll/tests/rtl.c
+++ b/dlls/ntdll/tests/rtl.c
@@ -82,6 +82,7 @@ static BOOL      (WINAPI *pRtlIsCriticalSectionLockedByThread)(CRITICAL_SECTION
 static NTSTATUS  (WINAPI *pRtlInitializeCriticalSectionEx)(CRITICAL_SECTION *, ULONG, ULONG);
 static NTSTATUS  (WINAPI *pLdrEnumerateLoadedModules)(void *, void *, void *);
 static NTSTATUS  (WINAPI *pLdrGetDllFullName)(HMODULE, PUNICODE_STRING);
+static NTSTATUS  (WINAPI *pLdrGetProcedureAddress)(HMODULE, PCANSI_STRING, WORD, void **);
 static NTSTATUS  (WINAPI *pLdrRegisterDllNotification)(ULONG, PLDR_DLL_NOTIFICATION_FUNCTION, void *, void **);
 static NTSTATUS  (WINAPI *pLdrUnregisterDllNotification)(void *);
 
@@ -123,6 +124,7 @@ static void InitFunctionPtrs(void)
         pRtlInitializeCriticalSectionEx = (void *)GetProcAddress(hntdll, "RtlInitializeCriticalSectionEx");
         pLdrEnumerateLoadedModules = (void *)GetProcAddress(hntdll, "LdrEnumerateLoadedModules");
         pLdrGetDllFullName = (void *)GetProcAddress(hntdll, "LdrGetDllFullName");
+        pLdrGetProcedureAddress = (void *)GetProcAddress(hntdll, "LdrGetProcedureAddress");
         pLdrRegisterDllNotification = (void *)GetProcAddress(hntdll, "LdrRegisterDllNotification");
         pLdrUnregisterDllNotification = (void *)GetProcAddress(hntdll, "LdrUnregisterDllNotification");
     }
@@ -3546,6 +3548,26 @@ static void test_LdrGetDllFullName(void)
        wine_dbgstr_w(ntdll_path), wine_dbgstr_w(path_buffer));
 }
 
+static void test_LdrGetProcedureAddress(void)
+{
+    NTSTATUS status;
+    FARPROC fp;
+
+    if (!pLdrGetProcedureAddress)
+    {
+        win_skip("LdrGetProcedureAddress not available\n");
+        return;
+    }
+
+    if (0) /* crashes on Windows */
+        status = pLdrGetProcedureAddress(NULL, NULL, 0, NULL);
+
+    fp = (FARPROC)0xdeadbeef;
+    status = pLdrGetProcedureAddress(NULL, NULL, 0, (void **)&fp);
+    ok(status == STATUS_DLL_NOT_FOUND, "Expected STATUS_DLL_NOT_FOUND, got %08x\n", status);
+    ok(!fp, "Expected NULL function pointer, got %p\n", fp);
+}
+
 START_TEST(rtl)
 {
     InitFunctionPtrs();
@@ -3587,4 +3609,5 @@ START_TEST(rtl)
     test_RtlMakeSelfRelativeSD();
     test_LdrRegisterDllNotification();
     test_LdrGetDllFullName();
+    test_LdrGetProcedureAddress();
 }
-- 
2.27.0




More information about the wine-devel mailing list