From: Ziqing Hui zhui@codeweavers.com
--- dlls/shell32/shlfileop.c | 42 ++++++++++++++----------------- dlls/shell32/tests/shlfileop.c | 46 +++++++++++++++++----------------- 2 files changed, 42 insertions(+), 46 deletions(-)
diff --git a/dlls/shell32/shlfileop.c b/dlls/shell32/shlfileop.c index fb8c73fa83a..c330a94b3b1 100644 --- a/dlls/shell32/shlfileop.c +++ b/dlls/shell32/shlfileop.c @@ -1056,25 +1056,17 @@ static void parse_wildcard_files(FILE_LIST *file_list, LPCWSTR szFile) }
/* takes the null-separated file list and fills out the FILE_LIST */ -static HRESULT parse_file_list(FILE_LIST *flList, LPCWSTR szFiles, BOOL parse_wildcard) +static void parse_file_list(FILE_LIST *flList, LPCWSTR szFiles, BOOL parse_wildcard) { LPCWSTR ptr = szFiles; WCHAR szCurFile[MAX_PATH]; WCHAR *p;
- if (!szFiles) - return ERROR_INVALID_PARAMETER; - flList->bAnyFromWildcard = FALSE; flList->bAnyDirectories = FALSE; flList->bAnyDontExist = FALSE; flList->num_alloc = 32; flList->dwNumFiles = 0; - - /* empty list */ - if (!szFiles[0]) - return ERROR_ACCESS_DENIED; - flList->feFiles = calloc(flList->num_alloc, sizeof(FILE_ENTRY));
while (*ptr) @@ -1103,8 +1095,6 @@ static HRESULT parse_file_list(FILE_LIST *flList, LPCWSTR szFiles, BOOL parse_wi /* advance to the next string */ ptr += lstrlenW(ptr) + 1; } - - return S_OK; }
static void create_dest_dirs(LPCWSTR szDestDir) @@ -1133,8 +1123,7 @@ static DWORD copy_wildcard(FILE_OPERATION *op, const FILE_ENTRY *from, const FIL DWORD i, ret;
wcscpy(buffer, from->szFullPath); - if ((ret = parse_file_list(&from_files, buffer, TRUE)) != ERROR_SUCCESS) - return ret; + parse_file_list(&from_files, buffer, TRUE);
for (i = 0; i < from_files.dwNumFiles; ++i) { @@ -1524,24 +1513,32 @@ int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp) FILE_LIST flFrom, flTo; int ret = 0;
- if (!lpFileOp) + if (!lpFileOp || !lpFileOp->pFrom) return ERROR_INVALID_PARAMETER;
check_flags(lpFileOp->fFlags);
ZeroMemory(&flFrom, sizeof(FILE_LIST)); ZeroMemory(&flTo, sizeof(FILE_LIST)); + ZeroMemory(&op, sizeof(op)); + op.req = lpFileOp; + lpFileOp->fAnyOperationsAborted = FALSE;
- if ((ret = parse_file_list(&flFrom, lpFileOp->pFrom, parse_wildcard))) - return ret; + if (lpFileOp->wFunc != FO_MOVE + && lpFileOp->wFunc != FO_COPY + && lpFileOp->wFunc != FO_DELETE + && lpFileOp->wFunc != FO_RENAME) + return ERROR_INVALID_PARAMETER; + + parse_file_list(&flFrom, lpFileOp->pFrom, parse_wildcard); + op.bManyItems = (flFrom.dwNumFiles > 1);
if (lpFileOp->wFunc != FO_DELETE) + { + if (!lpFileOp->pTo) + return ERROR_ACCESS_DENIED; parse_file_list(&flTo, lpFileOp->pTo, FALSE); - - ZeroMemory(&op, sizeof(op)); - op.req = lpFileOp; - op.bManyItems = (flFrom.dwNumFiles > 1); - lpFileOp->fAnyOperationsAborted = FALSE; + }
if (flTo.bAnyFromWildcard) return ERROR_INVALID_NAME; @@ -1561,8 +1558,7 @@ int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp) ret = rename_files(lpFileOp, &flFrom, &flTo); break; default: - ret = ERROR_INVALID_PARAMETER; - break; + assert(0); /* Should never be here. */ }
file_list_destroy(&flFrom); diff --git a/dlls/shell32/tests/shlfileop.c b/dlls/shell32/tests/shlfileop.c index 3ec2757aca0..712b002f9fd 100644 --- a/dlls/shell32/tests/shlfileop.c +++ b/dlls/shell32/tests/shlfileop.c @@ -675,7 +675,7 @@ static void test_delete(void) /* Empty filename. */ init_shfo_tests(); check_file_operation(FO_DELETE, FOF_NO_UI, "\0", NULL, - ERROR_SUCCESS, FALSE, TRUE, TRUE); + ERROR_SUCCESS, FALSE, FALSE, FALSE); ok(file_exists("test1.txt"), "Expected test1.txt to exist\n");
/* NULL filename. */ @@ -692,7 +692,7 @@ static void test_delete(void) /* Empty filename, only one null terminator */ init_shfo_tests(); check_file_operation(FO_DELETE, FOF_NO_UI, "", NULL, - ERROR_SUCCESS, FALSE, TRUE, TRUE); + ERROR_SUCCESS, FALSE, FALSE, FALSE); ok(file_exists("test1.txt"), "Expected test1.txt to exist\n");
/* Nonexistent file. */ @@ -840,13 +840,13 @@ static void test_rename(void) init_shfo_tests(); check_file_operation(FO_RENAME, FOF_NO_UI, "\0", "test1.txt", - DE_MANYSRC1DEST, FALSE, TRUE, TRUE); + DE_MANYSRC1DEST, FALSE, FALSE, FALSE); check_file_operation(FO_RENAME, FOF_NO_UI, "\0", "testdir2", - DE_MANYSRC1DEST, FALSE, TRUE, TRUE); + DE_MANYSRC1DEST, FALSE, FALSE, FALSE); check_file_operation(FO_RENAME, FOF_NO_UI, "\0", "nonexistence", - DE_MANYSRC1DEST, FALSE, TRUE, TRUE); + DE_MANYSRC1DEST, FALSE, FALSE, FALSE); ok(!file_exists("nonexistence"), "Expected nonexistence to not exist\n"); check_file_operation(FO_RENAME, FOF_NO_UI, "testdir2\0", "\0", @@ -861,7 +861,7 @@ static void test_rename(void) ERROR_FILE_NOT_FOUND, FALSE, FALSE, FALSE); check_file_operation(FO_RENAME, FOF_NO_UI, "\0", "\0", - DE_MANYSRC1DEST, FALSE, TRUE, TRUE); + DE_MANYSRC1DEST, FALSE, FALSE, FALSE);
/* NULL source or target. */ clean_after_shfo_tests(); @@ -877,13 +877,13 @@ static void test_rename(void) ERROR_INVALID_PARAMETER, 0xdeadbeef, FALSE, FALSE); check_file_operation(FO_RENAME, FOF_NO_UI, "test1.txt\0", NULL, - ERROR_ACCESS_DENIED, FALSE, TRUE, FALSE); + ERROR_ACCESS_DENIED, FALSE, FALSE, FALSE); check_file_operation(FO_RENAME, FOF_NO_UI, "testdir2\0", NULL, - ERROR_ACCESS_DENIED, FALSE, TRUE, FALSE); + ERROR_ACCESS_DENIED, FALSE, FALSE, FALSE); check_file_operation(FO_RENAME, FOF_NO_UI, "nonexistence\0", NULL, - ERROR_ACCESS_DENIED, FALSE, TRUE, FALSE); + ERROR_ACCESS_DENIED, FALSE, FALSE, FALSE); check_file_operation(FO_RENAME, FOF_NO_UI, NULL, NULL, ERROR_INVALID_PARAMETER, 0xdeadbeef, FALSE, FALSE); @@ -1502,16 +1502,16 @@ static void test_copy(void) ERROR_FILE_NOT_FOUND, FALSE, FALSE, FALSE); check_file_operation(FO_COPY, FOF_NO_UI, "\0", "testdir2\0", - ERROR_SUCCESS, FALSE, TRUE, TRUE); + ERROR_SUCCESS, FALSE, FALSE, FALSE); check_file_operation(FO_COPY, FOF_NO_UI, "\0", "testfile.txt\0", - ERROR_SUCCESS, FALSE, TRUE, TRUE); + ERROR_SUCCESS, FALSE, FALSE, FALSE); check_file_operation(FO_COPY, FOF_NO_UI, "\0", "nonexistence", - ERROR_SUCCESS, FALSE, TRUE, TRUE); + ERROR_SUCCESS, FALSE, FALSE, FALSE); check_file_operation(FO_COPY, FOF_NO_UI, "\0", "\0", - ERROR_SUCCESS, FALSE, TRUE, TRUE); + ERROR_SUCCESS, FALSE, FALSE, FALSE);
/* NULL source or target. */ clean_after_shfo_tests(); @@ -1527,13 +1527,13 @@ static void test_copy(void) ERROR_INVALID_PARAMETER, 0xdeadbeef, FALSE, FALSE); check_file_operation(FO_COPY, FOF_NO_UI, "test1.txt\0", NULL, - ERROR_ACCESS_DENIED, FALSE, TRUE, FALSE); + ERROR_ACCESS_DENIED, FALSE, FALSE, FALSE); check_file_operation(FO_COPY, FOF_NO_UI, "testdir2\0", NULL, - ERROR_ACCESS_DENIED, FALSE, TRUE, FALSE); + ERROR_ACCESS_DENIED, FALSE, FALSE, FALSE); check_file_operation(FO_COPY, FOF_NO_UI, "nonexistence\0", NULL, - ERROR_ACCESS_DENIED, FALSE, TRUE, FALSE); + ERROR_ACCESS_DENIED, FALSE, FALSE, FALSE); check_file_operation(FO_COPY, FOF_NO_UI, NULL, NULL, ERROR_INVALID_PARAMETER, 0xdeadbeef, FALSE, FALSE); @@ -1847,13 +1847,13 @@ static void test_move(void) init_shfo_tests(); check_file_operation(FO_MOVE, FOF_NO_UI, "\0", "test1.txt\0", - ERROR_SUCCESS, FALSE, TRUE, TRUE); + ERROR_SUCCESS, FALSE, FALSE, FALSE); check_file_operation(FO_MOVE, FOF_NO_UI, "\0", "testdir2\0", - ERROR_SUCCESS, FALSE, TRUE, TRUE); + ERROR_SUCCESS, FALSE, FALSE, FALSE); check_file_operation(FO_MOVE, FOF_NO_UI, "\0", "nonexistence\0", - ERROR_SUCCESS, FALSE, TRUE, TRUE); + ERROR_SUCCESS, FALSE, FALSE, FALSE); ok(!file_exists("nonexistence"), "Expected nonexistence to not exist.\n"); check_file_operation(FO_MOVE, FOF_NO_UI, "test1.txt", "\0", @@ -1866,7 +1866,7 @@ static void test_move(void) ERROR_FILE_NOT_FOUND, FALSE, FALSE, FALSE); check_file_operation(FO_MOVE, FOF_NO_UI, "\0", "\0", - ERROR_SUCCESS, FALSE, TRUE, TRUE); + ERROR_SUCCESS, FALSE, FALSE, FALSE);
/* NULL source or target. */ clean_after_shfo_tests(); @@ -1882,13 +1882,13 @@ static void test_move(void) ERROR_INVALID_PARAMETER, 0xdeadbeef, FALSE, FALSE); check_file_operation(FO_MOVE, FOF_NO_UI, "test1.txt\0", NULL, - ERROR_ACCESS_DENIED, FALSE, TRUE, FALSE); + ERROR_ACCESS_DENIED, FALSE, FALSE, FALSE); check_file_operation(FO_MOVE, FOF_NO_UI, "testdir2\0", NULL, - ERROR_ACCESS_DENIED, FALSE, TRUE, FALSE); + ERROR_ACCESS_DENIED, FALSE, FALSE, FALSE); check_file_operation(FO_MOVE, FOF_NO_UI, "nonexistent\0", NULL, - ERROR_ACCESS_DENIED, FALSE, TRUE, FALSE); + ERROR_ACCESS_DENIED, FALSE, FALSE, FALSE); check_file_operation(FO_MOVE, FOF_NO_UI, NULL, NULL, ERROR_INVALID_PARAMETER, 0xdeadbeef, FALSE, FALSE);