Strip trailing slashes from Windows filesystem paths
authorEric Biggers <ebiggers3@gmail.com>
Tue, 29 Apr 2014 22:20:58 +0000 (17:20 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Tue, 29 Apr 2014 22:21:47 +0000 (17:21 -0500)
src/extract.c
src/win32_capture.c

index 1b7eb6b..b1f62b1 100644 (file)
@@ -2529,6 +2529,18 @@ extract_trees(WIMStruct *wim, struct wim_dentry **trees, size_t num_trees,
                        goto out_destroy_stream_list;
                }
                ctx.realtarget_nchars = tstrlen(ctx.realtarget);
+       #ifdef __WIN32__
+              /* Strip trailing slashes.  If we don't do this, we may create a
+               * path with multiple consecutive backslashes, which for some
+               * reason causes Windows to report that the file cannot be found.
+               */
+               while (ctx.realtarget_nchars >= 2
+                      && ctx.realtarget[ctx.realtarget_nchars - 1] == L'\\'
+                      && ctx.realtarget[ctx.realtarget_nchars - 2] != L':')
+               {
+                       ctx.realtarget[--ctx.realtarget_nchars] = L'\0';
+               }
+       #endif
        }
 
        if (progress_func) {
index 745ee77..c62abce 100644 (file)
@@ -1411,6 +1411,16 @@ win32_build_dentry_tree(struct wim_dentry **root_ret,
                wmemcpy(path, root_disk_path, path_nchars + 1);
        }
 
+       /* Strip trailing slashes.  If we don't do this, we may create a path
+       * with multiple consecutive backslashes, which for some reason causes
+       * Windows to report that the file cannot be found.  */
+       while (path_nchars >= 2 &&
+              path[path_nchars - 1] == L'\\' &&
+              path[path_nchars - 2] != L':')
+       {
+               path[--path_nchars] = L'\0';
+       }
+
        params->capture_root_nchars = path_nchars;
 
        memset(&state, 0, sizeof(state));