From: yaoyongjie yaoyongjie@uniontech.com
If alloc is FALSE, file_name_AtoW will uses the TEB static buffer, but the buffer size is MAX_PATH+1 . If DeleteFileA is to support long paths prefixed with "\\?\", alloc must be set to TRUE. --- dlls/kernel32/tests/file.c | 16 ++++++++-------- dlls/kernelbase/file.c | 7 +++++-- 2 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index a98c48ccd7b..d841a5cbd17 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -1413,9 +1413,9 @@ static void test_CopyFileEx(void) retok = CopyFileExA(long_path_1, long_path_2, NULL, NULL, NULL, 0); ok(retok, "Expected CopyFileExA succeeded, but got %ld, copy %s -> %s\n", GetLastError(), long_path_1, long_path_2); retok = DeleteFileA(long_path_1); - todo_wine ok(retok, "DeleteFileA failed: %ld, %s\n", GetLastError(), long_path_1); + ok(retok, "DeleteFileA failed: %ld, %s\n", GetLastError(), long_path_1); retok = DeleteFileA(long_path_2); - todo_wine ok(retok, "DeleteFileA failed: %ld, %s\n", GetLastError(), long_path_2); + ok(retok, "DeleteFileA failed: %ld, %s\n", GetLastError(), long_path_2); } else { @@ -1430,9 +1430,9 @@ static void test_CopyFileEx(void) retok = CopyFileExA(long_path_1, long_path_2, NULL, NULL, NULL, 0); ok(!retok && GetLastError() == ERROR_PATH_NOT_FOUND, "Expected CopyFileExA failed with ERROR_PATH_NOT_FOUND, but got %ld, copy %s -> %s\n", GetLastError(), long_path_1, long_path_2); retok = DeleteFileA(long_path_1); - todo_wine ok(!retok, "Unexpected DeleteFileA successed\n"); + ok(!retok, "Unexpected DeleteFileA successed\n"); retok = DeleteFileA(long_path_2); - todo_wine ok(!retok, "Unexpected DeleteFileA successed\n"); + ok(!retok, "Unexpected DeleteFileA successed\n"); }
/* test long file name prepend "\?" */ @@ -1450,9 +1450,9 @@ static void test_CopyFileEx(void) ok(retok, "CopyFileExA failed, got %ld, copy %s -> %s failed\n", GetLastError(), long_path_1, long_path_2);
retok = DeleteFileA(long_path_1); - todo_wine ok(retok, "DeleteFileA failed: %lu, %s\n", GetLastError(), long_path_1); + ok(retok, "DeleteFileA failed: %lu, %s\n", GetLastError(), long_path_1); retok = DeleteFileA(long_path_2); - todo_wine ok(retok, "DeleteFileA failed: %lu, %s\n", GetLastError(), long_path_2); + ok(retok, "DeleteFileA failed: %lu, %s\n", GetLastError(), long_path_2);
ret = DeleteFileA(source); ok(ret, "DeleteFileA failed with error %ld\n", GetLastError()); @@ -2170,7 +2170,7 @@ static void test_DeleteFileA( void ) strcpy(long_path, temp_path); strcat(long_path, a); ret = DeleteFileA(long_path); - todo_wine ok(ret, "DeleteFileA failed with error %ld\n", GetLastError()); + ok(ret, "DeleteFileA failed with error %ld\n", GetLastError()); } else { @@ -2179,7 +2179,7 @@ static void test_DeleteFileA( void ) strcat(long_path, a); SetLastError(0xdeadbeef); ret = DeleteFileA(long_path); - todo_wine ok(ret, "DeleteFileA failed with error %ld\n", GetLastError()); + ok(ret, "DeleteFileA failed with error %ld\n", GetLastError());
ret = CopyFileExA(argv[0], long_path, NULL, NULL, NULL, 0); ok(ret, "got error %lu\n", GetLastError()); diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c index 0f70e28063f..152b9fb8771 100644 --- a/dlls/kernelbase/file.c +++ b/dlls/kernelbase/file.c @@ -1005,9 +1005,12 @@ BOOLEAN WINAPI /* DECLSPEC_HOTPATCH */ CreateSymbolicLinkW( LPCWSTR link, LPCWST BOOL WINAPI DECLSPEC_HOTPATCH DeleteFileA( LPCSTR path ) { WCHAR *pathW; + BOOL res;
- if (!(pathW = file_name_AtoW( path, FALSE ))) return FALSE; - return DeleteFileW( pathW ); + if (!(pathW = file_name_AtoW( path, TRUE ))) return FALSE; + res = DeleteFileW( pathW ); + HeapFree( GetProcessHeap(), 0, pathW ); + return res; }