]> wimlib.net Git - wimlib/blobdiff - src/win32_apply.c
win32_apply.c: Fix reparse point fixup of device-direct links (no trailing slash)
[wimlib] / src / win32_apply.c
index 4f4cf6eb3350658bc01f14150fc7eeb2bfb0a2f1..280f7f541f46f8e3ceae71693a2711b07afec938 100644 (file)
@@ -21,6 +21,8 @@
  * along with wimlib; if not, see http://www.gnu.org/licenses/.
  */
 
+#ifdef __WIN32__
+
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
 #endif
@@ -1469,7 +1471,13 @@ skip_nt_toplevel_component(const wchar_t *path, size_t path_nchars)
 
 /* Given a Windows NT namespace path, such as \??\e:\Windows\System32, return a
  * pointer to the suffix of the path that is device-relative, such as
- * Windows\System32.  */
+ * Windows\System32.
+ *
+ * The path has an explicit length and is not necessarily null terminated.
+ *
+ * If the path just something like \??\e: then the returned pointer will point
+ * just past the colon; in this case the length of the result will be 0
+ * characters.  */
 static const wchar_t *
 get_device_relative_path(const wchar_t *path, size_t path_nchars)
 {
@@ -1482,7 +1490,7 @@ get_device_relative_path(const wchar_t *path, size_t path_nchars)
 
        path = wmemchr(path, L'\\', (end - path));
        if (!path)
-               return orig_path;
+               return end;
        do {
                path++;
        } while (path != end && *path == L'\\');
@@ -1531,14 +1539,18 @@ try_rpfix(u8 *rpbuf, u16 *rpbuflen_p, struct win32_apply_ctx *ctx)
 
        target_ntpath_nchars = ctx->target_ntpath.Length / sizeof(wchar_t);
 
-       fixed_subst_name_nchars = target_ntpath_nchars + 1 + relpath_nchars;
+       fixed_subst_name_nchars = target_ntpath_nchars;
+       if (relpath_nchars)
+               fixed_subst_name_nchars += 1 + relpath_nchars;
        wchar_t fixed_subst_name[fixed_subst_name_nchars];
 
        wmemcpy(fixed_subst_name, ctx->target_ntpath.Buffer,
                target_ntpath_nchars);
-       fixed_subst_name[target_ntpath_nchars] = L'\\';
-       wmemcpy(&fixed_subst_name[target_ntpath_nchars + 1],
-               relpath, relpath_nchars);
+       if (relpath_nchars) {
+               fixed_subst_name[target_ntpath_nchars] = L'\\';
+               wmemcpy(&fixed_subst_name[target_ntpath_nchars + 1],
+                       relpath, relpath_nchars);
+       }
        /* Doesn't need to be null-terminated.  */
 
        /* Print name should be Win32, but not all NT names can even be
@@ -2079,3 +2091,5 @@ const struct apply_operations win32_apply_ops = {
        .extract                = win32_extract,
        .context_size           = sizeof(struct win32_apply_ctx),
 };
+
+#endif /* __WIN32__ */