Add tests for various paths and undefined behavior with regards to LdrGetDllPath with LOAD_ALTERED_SEARCH_PATH and relative module names.
Signed-off-by: Nick Fox nick@foxsec.net --- v4: add another test case and fix todo_wine usage --- dlls/kernel32/tests/path.c | 101 +++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+)
diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c index f49af6d5bfe..b2a6d5acbda 100644 --- a/dlls/kernel32/tests/path.c +++ b/dlls/kernel32/tests/path.c @@ -2654,6 +2654,107 @@ static void test_LdrGetDllPath(void) ok( !lstrcmpW( path, L"\\?\c:" ), "got %s expected \\?\c:\n", wine_dbgstr_w(path)); pRtlReleasePath( path );
+ lstrcpyW( buffer, fooW ); + ret = pLdrGetDllPath( buffer, LOAD_WITH_ALTERED_SEARCH_PATH, &path, &unknown_ptr ); + ok( !ret, "LdrGetDllPath failed %x\n", ret ); + ok( !unknown_ptr, "unknown ptr %p\n", unknown_ptr ); + build_search_path( buffer, ARRAY_SIZE(buffer), NULL, TRUE ); + todo_wine + ok( path_equal( path, buffer ), "got %s expected %s\n", wine_dbgstr_w(path), wine_dbgstr_w(buffer)); + pRtlReleasePath( path ); + + lstrcpyW( buffer, L"temp" ); + p = buffer + lstrlenW( buffer ); + *p++ = '/'; + lstrcpyW( p, fooW ); + ret = pLdrGetDllPath( buffer, LOAD_WITH_ALTERED_SEARCH_PATH, &path, &unknown_ptr ); + ok( !ret, "LdrGetDllPath failed %x\n", ret ); + ok( !unknown_ptr, "unknown ptr %p\n", unknown_ptr ); + build_search_path( buffer, ARRAY_SIZE(buffer), NULL, TRUE ); + todo_wine + ok( path_equal( path, buffer ), "got %s expected %s\n", wine_dbgstr_w(path), wine_dbgstr_w(buffer)); + pRtlReleasePath( path ); + + lstrcpyW( buffer, L".\foo\foooo" ); + ret = pLdrGetDllPath( buffer, LOAD_WITH_ALTERED_SEARCH_PATH, &path, &unknown_ptr ); + ok( !ret, "LdrGetDllPath failed %x\n", ret ); + ok( !unknown_ptr, "unknown ptr %p\n", unknown_ptr ); + lstrcpyW( buffer, L".\foo" ); + p = buffer + lstrlenW( buffer ); + *p++ = ';'; + GetSystemDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p ); + p = buffer + lstrlenW(buffer); + *p++ = ';'; + GetSystemDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p ); + p = buffer + lstrlenW(buffer) - 2; /* remove "32" */ + *p++ = ';'; + GetWindowsDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p ); + p = buffer + lstrlenW(buffer); + *p++ = ';'; + *p++ = '.'; + *p++ = ';'; + GetEnvironmentVariableW( pathW, p, buffer + ARRAY_SIZE(buffer) - p ); + ok( path_equal( path, buffer ), "got %s expected %s\n", wine_dbgstr_w(path), wine_dbgstr_w(buffer)); + pRtlReleasePath( path ); + + lstrcpyW( buffer, L"temp" ); + p = buffer + lstrlenW( buffer ); + *p++ = '\'; + lstrcpyW( p, fooW ); + ret = pLdrGetDllPath( buffer, LOAD_WITH_ALTERED_SEARCH_PATH, &path, &unknown_ptr ); + ok( !ret, "LdrGetDllPath failed %x\n", ret ); + ok( !unknown_ptr, "unknown ptr %p\n", unknown_ptr ); + lstrcpyW( buffer, L"temp" ); + p = buffer + lstrlenW( buffer ); + *p++ = '\'; + *p++ = ';'; + GetSystemDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p ); + p = buffer + lstrlenW(buffer); + *p++ = ';'; + GetSystemDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p ); + p = buffer + lstrlenW(buffer) - 2; /* remove "32" */ + *p++ = ';'; + GetWindowsDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p ); + p = buffer + lstrlenW(buffer); + *p++ = ';'; + *p++ = '.'; + *p++ = ';'; + GetEnvironmentVariableW( pathW, p, buffer + ARRAY_SIZE(buffer) - p ); + ok( path_equal( path, buffer ), "got %s expected %s\n", wine_dbgstr_w(path), wine_dbgstr_w(buffer)); + pRtlReleasePath( path ); + + lstrcpyW( buffer, L"c:\temp" ); + p = buffer + lstrlenW(buffer); + *p++ = '\'; + lstrcpyW( p, fooW ); + ret = pLdrGetDllPath( buffer, LOAD_WITH_ALTERED_SEARCH_PATH, &path, &unknown_ptr ); + ok( !ret, "LdrGetDllPath failed %x\n", ret ); + ok( !unknown_ptr, "unknown ptr %p\n", unknown_ptr ); + lstrcpyW( buffer, L"c:\temp" ); + p = buffer + lstrlenW( buffer ); + *p++ = '\'; + *p++ = ';'; + GetSystemDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p ); + p = buffer + lstrlenW(buffer); + *p++ = ';'; + GetSystemDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p ); + p = buffer + lstrlenW(buffer) - 2; /* remove "32" */ + *p++ = ';'; + GetWindowsDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p ); + p = buffer + lstrlenW(buffer); + *p++ = ';'; + *p++ = '.'; + *p++ = ';'; + GetEnvironmentVariableW( pathW, p, buffer + ARRAY_SIZE(buffer) - p ); + ok( path_equal( path, buffer ), "got %s expected %s\n", wine_dbgstr_w(path), wine_dbgstr_w(buffer)); + pRtlReleasePath( path ); + + lstrcpyW( buffer, fooW ); + ret = pLdrGetDllPath( buffer, LOAD_WITH_ALTERED_SEARCH_PATH | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR, &path, &unknown_ptr ); + ok( ret == STATUS_INVALID_PARAMETER, "got %x expected %x\n", ret, STATUS_INVALID_PARAMETER ); + ok( !unknown_ptr, "unknown ptr %p\n", unknown_ptr ); + pRtlReleasePath( path ); + lstrcpyW( buffer, dlldir ); p = buffer + lstrlenW(buffer); *p++ = '\'; -- 2.33.0