Daniel Lehman : shell32: Convert / to \ when parsing file list.

Alexandre Julliard julliard at winehq.org
Wed May 9 16:35:12 CDT 2018


Module: wine
Branch: master
Commit: da8a801a582a32b6577c3ac8a58d713c058fdc9e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=da8a801a582a32b6577c3ac8a58d713c058fdc9e

Author: Daniel Lehman <dlehman25 at gmail.com>
Date:   Tue May  8 20:50:20 2018 -0700

shell32: Convert / to \ when parsing file list.

Signed-off-by: Daniel Lehman <dlehman25 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/shell32/shlfileop.c       |  3 +++
 dlls/shell32/tests/shlfileop.c | 46 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+)

diff --git a/dlls/shell32/shlfileop.c b/dlls/shell32/shlfileop.c
index 5d93334..4507b72 100644
--- a/dlls/shell32/shlfileop.c
+++ b/dlls/shell32/shlfileop.c
@@ -1005,6 +1005,7 @@ static HRESULT parse_file_list(FILE_LIST *flList, LPCWSTR szFiles)
 {
     LPCWSTR ptr = szFiles;
     WCHAR szCurFile[MAX_PATH];
+    WCHAR *p;
     DWORD i = 0;
 
     if (!szFiles)
@@ -1039,6 +1040,8 @@ static HRESULT parse_file_list(FILE_LIST *flList, LPCWSTR szFiles)
             flList->feFiles[i].bFromRelative = FALSE;
         }
 
+        for (p = szCurFile; *p; p++) if (*p == '/') *p = '\\';
+
         /* parse wildcard files if they are in the filename */
         if (StrPBrkW(szCurFile, wWildcardChars))
         {
diff --git a/dlls/shell32/tests/shlfileop.c b/dlls/shell32/tests/shlfileop.c
index 6a220fa..8fb4dcf 100644
--- a/dlls/shell32/tests/shlfileop.c
+++ b/dlls/shell32/tests/shlfileop.c
@@ -1869,6 +1869,28 @@ static void test_copy(void)
     ok(retval != ERROR_SUCCESS, "Unexpected ERROR_SUCCESS\n");
     ok(!shfo.fAnyOperationsAborted, "Didn't expect aborted operations\n");
     ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
+
+    /* test with / */
+    CreateDirectoryA("dir", NULL);
+    CreateDirectoryA("dir\\subdir", NULL);
+    createTestFile("dir\\subdir\\aa.txt");
+    shfo.pFrom = "dir/subdir/aa.txt\0";
+    shfo.pTo = "dir\\destdir/aa.txt\0";
+    shfo.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_SILENT | FOF_NOERRORUI;
+    retval = SHFileOperationA(&shfo);
+    if (dir_exists("dir\\destdir"))
+    {
+        ok(retval == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", retval);
+        ok(DeleteFileA("dir\\destdir\\aa.txt"), "Expected file to exist\n");
+        ok(RemoveDirectoryA("dir\\destdir"), "Expected dir to exist\n");
+    }
+    else
+    {
+        expect_retval(ERROR_CANCELLED, DE_OPCANCELLED /* WinXp, Win2k */);
+    }
+    ok(DeleteFileA("dir\\subdir\\aa.txt"), "Expected file to exist\n");
+    ok(RemoveDirectoryA("dir\\subdir"), "Expected dir to exist\n");
+    ok(RemoveDirectoryA("dir"), "Expected dir to exist\n");
 }
 
 /* tests the FO_MOVE action */
@@ -1921,6 +1943,30 @@ static void test_move(void)
     clean_after_shfo_tests();
     init_shfo_tests();
 
+    /* same tests above, but with / */
+    set_curr_dir_path(from, "testdir2/*.*\0");
+    set_curr_dir_path(to, "test4.txt\0");
+    retval = SHFileOperationA(&shfo);
+    ok(retval == ERROR_SUCCESS ||
+       broken(retval == ERROR_FILE_NOT_FOUND), /* WinXp, Win2k3 */
+       "Expected ERROR_SUCCESS, got %d\n", retval);
+    if (retval == ERROR_SUCCESS)
+    {
+        ok(!shfo.fAnyOperationsAborted, "fAnyOperationsAborted %d\n", shfo.fAnyOperationsAborted);
+
+        ok(dir_exists("testdir2"), "dir should not be moved\n");
+        ok(!file_exists("testdir2\\one.txt"), "file should be moved\n");
+        ok(!dir_exists("testdir2\\nested"), "dir should be moved\n");
+        ok(!file_exists("testdir2\\nested\\two.txt"), "file should be moved\n");
+
+        ok(file_exists("test4.txt\\one.txt"), "file should exist\n");
+        ok(dir_exists("test4.txt\\nested"), "dir should exist\n");
+        ok(file_exists("test4.txt\\nested\\two.txt"), "file should exist\n");
+    }
+
+    clean_after_shfo_tests();
+    init_shfo_tests();
+
     shfo.hwnd = NULL;
     shfo.wFunc = FO_MOVE;
     shfo.pFrom = from;




More information about the wine-cvs mailing list