[PATCH] kernel32: CreateFile() -> ERROR_PATH_NOT_FOUND when a dir in the path doesn't exist
Damjan Jovanovic
damjan.jov at gmail.com
Wed Apr 22 00:18:17 CDT 2020
Python's test_tempfile.py unit test fails because it
(ultimately) expects CreateFile() to fail with ERROR_PATH_NOT_FOUND
when the path contains a directory which doesn't exist,
and we fail with ERROR_DIRECTORY instead.
Signed-off-by: Damjan Jovanovic <damjan.jov at gmail.com>
---
dlls/kernel32/tests/file.c | 9 +++++++++
dlls/kernelbase/file.c | 2 ++
2 files changed, 11 insertions(+)
-------------- next part --------------
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index 29620654bd..172bb1f637 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -33,6 +33,7 @@
#include "winerror.h"
#include "winternl.h"
#include "winnls.h"
+#include "winuser.h"
#include "fileapi.h"
#undef DeleteFile /* needed for FILE_DISPOSITION_INFO */
@@ -1589,9 +1590,11 @@ static void test_CreateFileW(void)
HANDLE hFile;
WCHAR temp_path[MAX_PATH];
WCHAR filename[MAX_PATH];
+ WCHAR temp_filename[MAX_PATH];
static const WCHAR emptyW[]={'\0'};
static const WCHAR prefix[] = {'p','f','x',0};
static const WCHAR bogus[] = { '\\', '\\', '.', '\\', 'B', 'O', 'G', 'U', 'S', 0 };
+ static const WCHAR dir_fileW[] = {'%','s','\\','%','s',0};
DWORD ret;
ret = GetTempPathW(MAX_PATH, temp_path);
@@ -1639,6 +1642,12 @@ static void test_CreateFileW(void)
CloseHandle(hFile);
+ wsprintfW(temp_filename, dir_fileW, filename, prefix);
+ hFile = CreateFileW(temp_filename, GENERIC_READ, FILE_SHARE_READ, NULL,
+ OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, 0);
+ ok(hFile == INVALID_HANDLE_VALUE && (GetLastError() == ERROR_PATH_NOT_FOUND),
+ "hFile %p, last error %u\n", hFile, GetLastError());
+
ret = DeleteFileW(filename);
ok(ret, "DeleteFileW: error %d\n", GetLastError());
diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c
index 9ca184a5d0..1492778119 100644
--- a/dlls/kernelbase/file.c
+++ b/dlls/kernelbase/file.c
@@ -602,6 +602,8 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO
*/
if (status == STATUS_OBJECT_NAME_COLLISION)
SetLastError( ERROR_FILE_EXISTS );
+ else if (status == STATUS_NOT_A_DIRECTORY)
+ SetLastError( ERROR_PATH_NOT_FOUND );
else
SetLastError( RtlNtStatusToDosError(status) );
}
More information about the wine-devel
mailing list