From 6fb00db51e21914e57b2c4ea04b1a95081425d48 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 6 Feb 2019 10:45:18 +0100 Subject: [PATCH] ntdll: Don't use current directory for libraries unless explicitly specified in the search path. Signed-off-by: Alexandre Julliard --- dlls/kernel32/tests/module.c | 84 ++++++++++++++++++++++++++++++++++-- dlls/ntdll/loader.c | 12 ++---- 2 files changed, 84 insertions(+), 12 deletions(-) diff --git a/dlls/kernel32/tests/module.c b/dlls/kernel32/tests/module.c index ba65e0a7616..2314c84d94e 100644 --- a/dlls/kernel32/tests/module.c +++ b/dlls/kernel32/tests/module.c @@ -479,15 +479,13 @@ static void test_LoadLibraryEx_search_flags(void) { { 6, 5 }, 5, 0 }, { { 1, 1, 2 }, 0, 2 }, }; - char *p, path[MAX_PATH], buf[MAX_PATH]; + char *p, path[MAX_PATH], buf[MAX_PATH], curdir[MAX_PATH]; WCHAR bufW[MAX_PATH]; DLL_DIRECTORY_COOKIE cookies[4]; unsigned int i, j, k; BOOL ret; HMODULE mod; - if (!pAddDllDirectory || !pSetDllDirectoryA) return; - GetTempPathA( sizeof(path), path ); GetTempFileNameA( path, "tmp", 0, buf ); DeleteFileA( buf ); @@ -503,6 +501,80 @@ static void test_LoadLibraryEx_search_flags(void) sprintf( p, "\\%u\\winetestdll.dll", i ); create_test_dll( buf ); } + + GetCurrentDirectoryA( MAX_PATH, curdir ); + *p = 0; + SetCurrentDirectoryA( buf ); + + SetLastError( 0xdeadbeef ); + mod = LoadLibraryA( "1\\winetestdll.dll" ); + ok( mod != NULL, "LoadLibrary failed err %u\n", GetLastError() ); + FreeLibrary( mod ); + + SetLastError( 0xdeadbeef ); + sprintf( path, "%c:1\\winetestdll.dll", buf[0] ); + mod = LoadLibraryA( path ); + ok( mod != NULL, "LoadLibrary failed err %u\n", GetLastError() ); + FreeLibrary( mod ); + + if (pAddDllDirectory) + { + SetLastError( 0xdeadbeef ); + mod = LoadLibraryExA( "1\\winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_SYSTEM32 ); + ok( !mod, "LoadLibrary succeeded\n" ); + ok( GetLastError() == ERROR_MOD_NOT_FOUND, "wrong error %u\n", GetLastError() ); + + SetLastError( 0xdeadbeef ); + mod = LoadLibraryExA( path, 0, LOAD_LIBRARY_SEARCH_SYSTEM32 ); + ok( mod != NULL, "LoadLibrary failed err %u\n", GetLastError() ); + FreeLibrary( mod ); + } + + strcpy( p, "\\1" ); + SetCurrentDirectoryA( buf ); + + SetLastError( 0xdeadbeef ); + mod = LoadLibraryA( "winetestdll.dll" ); + ok( mod != NULL, "LoadLibrary failed err %u\n", GetLastError() ); + FreeLibrary( mod ); + + SetLastError( 0xdeadbeef ); + sprintf( path, "%c:winetestdll.dll", buf[0] ); + mod = LoadLibraryA( path ); + ok( mod != NULL || broken(!mod), /* win10 disallows this but allows c:1\\winetestdll.dll */ + "LoadLibrary failed err %u\n", GetLastError() ); + if (!mod) ok( GetLastError() == ERROR_MOD_NOT_FOUND, "wrong error %u\n", GetLastError() ); + else FreeLibrary( mod ); + + SetLastError( 0xdeadbeef ); + sprintf( path, "%s\\winetestdll.dll", buf + 2 ); + mod = LoadLibraryA( path ); + ok( mod != NULL, "LoadLibrary failed err %u\n", GetLastError() ); + FreeLibrary( mod ); + + if (pAddDllDirectory) + { + SetLastError( 0xdeadbeef ); + mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_SYSTEM32 ); + ok( !mod, "LoadLibrary succeeded\n" ); + ok( GetLastError() == ERROR_MOD_NOT_FOUND, "wrong error %u\n", GetLastError() ); + + SetLastError( 0xdeadbeef ); + mod = LoadLibraryExA( path, 0, LOAD_LIBRARY_SEARCH_SYSTEM32 ); + ok( mod != NULL, "LoadLibrary failed err %u\n", GetLastError() ); + FreeLibrary( mod ); + + SetLastError( 0xdeadbeef ); + sprintf( path, "%s\\winetestdll.dll", buf + 2 ); + mod = LoadLibraryExA( path, 0, LOAD_LIBRARY_SEARCH_SYSTEM32 ); + ok( mod != NULL, "LoadLibrary failed err %u\n", GetLastError() ); + FreeLibrary( mod ); + } + + SetCurrentDirectoryA( curdir ); + + if (!pAddDllDirectory || !pSetDllDirectoryA) goto done; + SetLastError( 0xdeadbeef ); mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_APPLICATION_DIR ); ok( !mod, "LoadLibrary succeeded\n" ); @@ -539,6 +611,11 @@ static void test_LoadLibraryEx_search_flags(void) ok( !mod, "LoadLibrary succeeded\n" ); ok( GetLastError() == ERROR_MOD_NOT_FOUND, "wrong error %u\n", GetLastError() ); + SetLastError( 0xdeadbeef ); + mod = LoadLibraryA( "1\\winetestdll.dll" ); + ok( !mod, "LoadLibrary succeeded\n" ); + ok( GetLastError() == ERROR_MOD_NOT_FOUND, "wrong error %u\n", GetLastError() ); + for (j = 0; j < ARRAY_SIZE(tests); j++) { for (k = 0; tests[j].add_dirs[k]; k++) @@ -575,6 +652,7 @@ static void test_LoadLibraryEx_search_flags(void) for (k = 0; tests[j].add_dirs[k]; k++) pRemoveDllDirectory( cookies[k] ); } +done: for (i = 1; i <= 6; i++) { sprintf( p, "\\%u\\winetestdll.dll", i ); diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index a47dfe0aa1a..1f92eb08007 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -2442,23 +2442,17 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname, return STATUS_NO_MEMORY; } *handle = open_dll_file( &nt_name, pwm, st ); - goto found; } - - /* not found */ - - if (!contains_path( libname )) + else /* not found, return the name as is, to be loaded as builtin */ { - /* if libname doesn't contain a path at all, we simply return the name as is, - * to be loaded as builtin */ len = strlenW(libname) * sizeof(WCHAR); if (len >= *size) goto overflow; strcpyW( filename, libname ); - goto found; } + goto found; } - /* absolute path name, or relative path name but not found above */ + /* absolute path name */ if (!RtlDosPathNameToNtPathName_U( libname, &nt_name, &file_part, NULL )) {