Zebediah Figura : setupapi: Use the source path if the target path is missing in SetupQueueRename().

Alexandre Julliard julliard at winehq.org
Mon Feb 7 15:56:06 CST 2022


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

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Sun Feb  6 22:53:32 2022 -0600

setupapi: Use the source path if the target path is missing in SetupQueueRename().

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/setupapi/queue.c         |  4 +-
 dlls/setupapi/tests/install.c | 91 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 93 insertions(+), 2 deletions(-)

diff --git a/dlls/setupapi/queue.c b/dlls/setupapi/queue.c
index e0287f63593..1773a4df3d7 100644
--- a/dlls/setupapi/queue.c
+++ b/dlls/setupapi/queue.c
@@ -723,7 +723,7 @@ BOOL WINAPI SetupQueueRenameA( HSPFILEQ handle, PCSTR SourcePath, PCSTR SourceFi
     if (!(op = heap_alloc_zero( sizeof(*op) ))) return FALSE;
     op->src_path = strdupAtoW( SourcePath );
     op->src_file = strdupAtoW( SourceFilename );
-    op->dst_path = strdupAtoW( TargetPath );
+    op->dst_path = strdupAtoW( TargetPath ? TargetPath : SourcePath );
     op->dst_file = strdupAtoW( TargetFilename );
     queue_file_op( &queue->rename_queue, op );
     return TRUE;
@@ -742,7 +742,7 @@ BOOL WINAPI SetupQueueRenameW( HSPFILEQ handle, PCWSTR SourcePath, PCWSTR Source
     if (!(op = heap_alloc_zero( sizeof(*op) ))) return FALSE;
     op->src_path = strdupW( SourcePath );
     op->src_file = strdupW( SourceFilename );
-    op->dst_path = strdupW( TargetPath );
+    op->dst_path = strdupW( TargetPath ? TargetPath : SourcePath );
     op->dst_file = strdupW( TargetFilename );
     queue_file_op( &queue->rename_queue, op );
     return TRUE;
diff --git a/dlls/setupapi/tests/install.c b/dlls/setupapi/tests/install.c
index 3a40f1450ab..498cd25aaab 100644
--- a/dlls/setupapi/tests/install.c
+++ b/dlls/setupapi/tests/install.c
@@ -2205,6 +2205,96 @@ static void test_register_dlls(void)
     ok(ret, "Failed to delete test DLL, error %u.\n", GetLastError());
 }
 
+static unsigned int start_rename_ret, got_start_rename;
+
+static UINT WINAPI start_rename_cb(void *context, UINT message, UINT_PTR param1, UINT_PTR param2)
+{
+    if (winetest_debug > 1) trace("%p, %#x, %#Ix, %#Ix\n", context, message, param1, param2);
+
+    if (message == SPFILENOTIFY_STARTRENAME)
+    {
+        const FILEPATHS_A *paths = (const FILEPATHS_A *)param1;
+
+        ++got_start_rename;
+
+        if (strstr(paths->Source, "three.txt"))
+        {
+            SetLastError(0xdeadf00d);
+            return start_rename_ret;
+        }
+    }
+
+    return SetupDefaultQueueCallbackA(context, message, param1, param2);
+}
+
+static void test_rename(void)
+{
+    HSPFILEQ queue;
+    BOOL ret;
+
+    ret = CreateDirectoryA("a", NULL);
+    ok(ret, "Failed to create test directory, error %u.\n", GetLastError());
+    ret = CreateDirectoryA("b", NULL);
+    ok(ret, "Failed to create test directory, error %u.\n", GetLastError());
+
+    create_file("a/one.txt");
+    create_file("b/three.txt");
+    create_file("a/five.txt");
+    create_file("b/six.txt");
+    start_rename_ret = FILEOP_DOIT;
+    got_start_rename = 0;
+    queue = SetupOpenFileQueue();
+    ok(queue != INVALID_HANDLE_VALUE, "Failed to open queue, error %#x.\n", GetLastError());
+    ret = SetupQueueCopyA(queue, "b", NULL, "one.txt", NULL, NULL, "b", "two.txt", 0);
+    ok(ret, "Failed to queue copy, error %#x.\n", GetLastError());
+    ret = SetupQueueRenameA(queue, "a", "one.txt", "b", "one.txt");
+    ok(ret, "Failed to queue rename, error %#x.\n", GetLastError());
+    ret = SetupQueueRenameA(queue, "b", "three.txt", NULL, "four.txt");
+    ok(ret, "Failed to queue rename, error %#x.\n", GetLastError());
+    ret = SetupQueueRenameA(queue, "b", "six.txt", "b", "seven.txt");
+    ok(ret, "Failed to queue rename, error %#x.\n", GetLastError());
+    ret = SetupQueueRenameA(queue, "a", "five.txt", "b", "six.txt");
+    ok(ret, "Failed to queue rename, error %#x.\n", GetLastError());
+    run_queue(queue, start_rename_cb);
+    ok(got_start_rename == 4, "Got %u callbacks.\n", got_start_rename);
+    ok(!delete_file("a/one.txt"), "File should not exist.\n");
+    ok(!delete_file("a/five.txt"), "File should not exist.\n");
+    ok(delete_file("b/one.txt"), "File should exist.\n");
+    ok(delete_file("b/two.txt"), "File should exist.\n");
+    ok(!delete_file("b/three.txt"), "File should not exist.\n");
+    ok(delete_file("b/four.txt"), "File should exist.\n");
+    ok(!delete_file("b/five.txt"), "File should not exist.\n");
+    ok(delete_file("b/six.txt"), "File should exist.\n");
+    ok(delete_file("b/seven.txt"), "File should exist.\n");
+    SetupCloseFileQueue(queue);
+
+    create_file("a/one.txt");
+    create_file("a/three.txt");
+    create_file("a/five.txt");
+    start_rename_ret = FILEOP_SKIP;
+    got_start_rename = 0;
+    queue = SetupOpenFileQueue();
+    ok(queue != INVALID_HANDLE_VALUE, "Failed to open queue, error %#x.\n", GetLastError());
+    ret = SetupQueueRenameA(queue, "a", "one.txt", "a", "two.txt");
+    ok(ret, "Failed to queue rename, error %#x.\n", GetLastError());
+    ret = SetupQueueRenameA(queue, "a", "three.txt", "a", "four.txt");
+    ok(ret, "Failed to queue rename, error %#x.\n", GetLastError());
+    ret = SetupQueueRenameA(queue, "a", "five.txt", "a", "six.txt");
+    ok(ret, "Failed to queue rename, error %#x.\n", GetLastError());
+    run_queue(queue, start_rename_cb);
+    ok(got_start_rename == 3, "Got %u callbacks.\n", got_start_rename);
+    ok(!delete_file("a/one.txt"), "File should not exist.\n");
+    ok(delete_file("a/two.txt"), "File should exist.\n");
+    ok(delete_file("a/three.txt"), "File should exist.\n");
+    ok(!delete_file("a/four.txt"), "File should not exist.\n");
+    ok(!delete_file("a/five.txt"), "File should not exist.\n");
+    ok(delete_file("a/six.txt"), "File should exist.\n");
+    SetupCloseFileQueue(queue);
+
+    ok(delete_file("a/"), "Failed to delete directory, error %u.\n", GetLastError());
+    ok(delete_file("b/"), "Failed to delete directory, error %u.\n", GetLastError());
+}
+
 static WCHAR service_name[] = L"Wine Test Service";
 static SERVICE_STATUS_HANDLE service_handle;
 static HANDLE stop_event;
@@ -2313,6 +2403,7 @@ START_TEST(install)
     test_install_file();
     test_start_copy();
     test_register_dlls();
+    test_rename();
 
     UnhookWindowsHookEx(hhook);
 




More information about the wine-cvs mailing list