[PATCH 2/3] setupapi: Fix a path leak (Valgrind).

Sven Baars sven.wine at gmail.com
Sat Aug 17 17:09:04 CDT 2019


Signed-off-by: Sven Baars <sven.wine at gmail.com>
---
 dlls/setupapi/queue.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/dlls/setupapi/queue.c b/dlls/setupapi/queue.c
index ba750b0ba8..e049bbe209 100644
--- a/dlls/setupapi/queue.c
+++ b/dlls/setupapi/queue.c
@@ -1408,13 +1408,20 @@ BOOL WINAPI SetupCommitFileQueueW( HWND owner, HSPFILEQ handle, PSP_FILE_CALLBAC
                  * actually isn't in a subdirectory, but keep track of what it
                  * was, and then later strip it from the root path that we
                  * ultimately resolve the source disk to. */
-                WCHAR *src_path = op->src_path;
+                WCHAR src_path[MAX_PATH];
+                size_t path_len = 0;
 
-                op->src_path = NULL;
-                if (src_path)
+                src_path[0] = 0;
+                if (op->src_path)
                 {
+                    lstrcpyW(src_path, op->src_path);
+                    path_len = lstrlenW(src_path);
+
                     lstrcatW(op->media->root, backslashW);
-                    lstrcatW(op->media->root, src_path);
+                    lstrcatW(op->media->root, op->src_path);
+
+                    heap_free(op->src_path);
+                    op->src_path = NULL;
                 }
 
                 for (;;)
@@ -1450,12 +1457,11 @@ BOOL WINAPI SetupCommitFileQueueW( HWND owner, HSPFILEQ handle, PSP_FILE_CALLBAC
 
                     if (queue_copy_file( paths.Source, paths.Target, op, handler, context ))
                     {
-                        if (src_path && !op->media->cabinet)
+                        if (path_len > 0 && !op->media->cabinet)
                         {
-                            size_t root_len = lstrlenW(op->media->root), path_len = lstrlenW(src_path);
+                            size_t root_len = lstrlenW(op->media->root);
                             if (path_len <= root_len && !wcsnicmp(op->media->root + root_len - path_len, src_path, path_len))
                                 op->media->root[root_len - path_len - 1] = 0;
-                            heap_free( src_path );
                         }
                         op->media->resolved = TRUE;
                         handler( context, SPFILENOTIFY_ENDCOPY, (UINT_PTR)&paths, 0 );
-- 
2.17.1




More information about the wine-devel mailing list