[PATCH 3/4] Fix last error in SearchPathA/W with tests
Nikolay Sivov
bunglehead at gmail.com
Sun Dec 20 17:10:59 CST 2009
---
dlls/kernel32/path.c | 16 +++++++++++-
dlls/kernel32/tests/path.c | 53 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 67 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c
index 7618dc9..9fa6cb3 100644
--- a/dlls/kernel32/path.c
+++ b/dlls/kernel32/path.c
@@ -758,6 +758,12 @@ DWORD WINAPI SearchPathW( LPCWSTR path, LPCWSTR name, LPCWSTR ext, DWORD buflen,
{
DWORD ret = 0;
+ if (!(name && name[0]))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return 0;
+ }
+
/* If the name contains an explicit path, ignore the path */
if (contains_pathW(name))
@@ -827,11 +833,17 @@ DWORD WINAPI SearchPathW( LPCWSTR path, LPCWSTR name, LPCWSTR ext, DWORD buflen,
DWORD WINAPI SearchPathA( LPCSTR path, LPCSTR name, LPCSTR ext,
DWORD buflen, LPSTR buffer, LPSTR *lastpart )
{
- WCHAR *pathW = NULL, *nameW = NULL, *extW = NULL;
+ WCHAR *pathW = NULL, *nameW, *extW = NULL;
WCHAR bufferW[MAX_PATH];
DWORD ret;
- if (!name || !(nameW = FILE_name_AtoW( name, FALSE ))) return 0;
+ if (!name)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return 0;
+ }
+
+ if (!(nameW = FILE_name_AtoW( name, FALSE ))) return 0;
if (path && !(pathW = FILE_name_AtoW( path, TRUE ))) return 0;
if (ext && !(extW = FILE_name_AtoW( ext, TRUE )))
diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c
index 4641c5e..7f0389e 100644
--- a/dlls/kernel32/tests/path.c
+++ b/dlls/kernel32/tests/path.c
@@ -57,6 +57,9 @@ static DWORD (WINAPI *pGetLongPathNameW)(LPWSTR,LPWSTR,DWORD);
static BOOL (WINAPI *pNeedCurrentDirectoryForExePathA)(LPCSTR);
static BOOL (WINAPI *pNeedCurrentDirectoryForExePathW)(LPCWSTR);
+static DWORD (WINAPI *pSearchPathA)(LPCSTR,LPCSTR,LPCSTR,DWORD,LPSTR,LPSTR*);
+static DWORD (WINAPI *pSearchPathW)(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPWSTR,LPWSTR*);
+
/* a structure to deal with wine todos somewhat cleanly */
typedef struct {
DWORD shortlen;
@@ -1456,6 +1459,53 @@ static void test_drive_letter_case(void)
#undef is_upper_case_letter
}
+static void test_SearchPath(void)
+{
+ CHAR pathA[MAX_PATH], fileA[] = "", buffA[MAX_PATH] = "*";
+ CHAR *ptrA = NULL;
+ WCHAR pathW[MAX_PATH], fileW[] = { 0 }, buffW[MAX_PATH] = { '*', 0 };
+ WCHAR *ptrW = NULL;
+ DWORD ret;
+
+ if (!pSearchPathA || !pSearchPathW)
+ {
+ win_skip("SearchPath isn't available\n");
+ return;
+ }
+
+ GetWindowsDirectoryA(pathA, sizeof(pathA)/sizeof(CHAR));
+ GetWindowsDirectoryW(pathW, sizeof(pathW)/sizeof(WCHAR));
+
+ /* NULL filename */
+ SetLastError(0xdeadbeef);
+ ret = pSearchPathA(pathA, NULL, NULL, sizeof(buffA)/sizeof(CHAR), buffA, &ptrA);
+ ok(ret == 0, "Expected failure, got %d\n", ret);
+ ok(GetLastError() == ERROR_INVALID_PARAMETER,
+ "Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
+
+ /* empty filename */
+ SetLastError(0xdeadbeef);
+ ret = pSearchPathA(pathA, fileA, NULL, sizeof(buffA)/sizeof(CHAR), buffA, &ptrA);
+ ok(ret == 0, "Expected failure, got %d\n", ret);
+ ok(GetLastError() == ERROR_INVALID_PARAMETER,
+ "Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
+
+ /* NULL filename */
+ SetLastError(0xdeadbeef);
+ ret = pSearchPathW(pathW, NULL, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, &ptrW);
+ ok(ret == 0, "Expected failure, got %d\n", ret);
+ ok(GetLastError() == ERROR_INVALID_PARAMETER,
+ "Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
+
+ /* empty filename */
+ SetLastError(0xdeadbeef);
+ ret = pSearchPathW(pathW, fileW, NULL, sizeof(buffW)/sizeof(WCHAR), buffW, &ptrW);
+ ok(ret == 0, "Expected failure, got %d\n", ret);
+ ok(GetLastError() == ERROR_INVALID_PARAMETER,
+ "Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
+}
+
+
static void init_pointers(void)
{
HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
@@ -1465,6 +1515,8 @@ static void init_pointers(void)
MAKEFUNC(GetLongPathNameW);
MAKEFUNC(NeedCurrentDirectoryForExePathA);
MAKEFUNC(NeedCurrentDirectoryForExePathW);
+ MAKEFUNC(SearchPathA);
+ MAKEFUNC(SearchPathW);
#undef MAKEFUNC
}
@@ -1493,4 +1545,5 @@ START_TEST(path)
test_NeedCurrentDirectoryForExePathA();
test_NeedCurrentDirectoryForExePathW();
test_drive_letter_case();
+ test_SearchPath();
}
--
1.5.6.5
--=-fiiAhySgMoUkdVDFx/v1--
More information about the wine-patches
mailing list