]> wimlib.net Git - wimlib/blobdiff - src/reparse.c
wim_inode_set_symlink(): Fix typo in comment
[wimlib] / src / reparse.c
index 505910979d06cf24049d741f3052608d2a5429d5..3b36548c3c63951c858c37970a8dde011a70c13d 100644 (file)
@@ -186,7 +186,7 @@ parse_reparse_data(const u8 * restrict rpbuf, u16 rpbuflen,
        if (rpdata->rptag == WIM_IO_REPARSE_TAG_SYMLINK) {
                if (rpbuflen < 20)
                        goto out_invalid;
-               rpdata->rpflags = le16_to_cpu(rpbuf_disk->symlink.rpflags);
+               rpdata->rpflags = le32_to_cpu(rpbuf_disk->symlink.rpflags);
                data = rpbuf_disk->symlink.data;
        } else {
                data = rpbuf_disk->junction.data;
@@ -215,7 +215,8 @@ out_invalid:
  */
 int
 make_reparse_buffer(const struct reparse_data * restrict rpdata,
-                   u8 * restrict rpbuf)
+                   u8 * restrict rpbuf,
+                   u16 * restrict rpbuflen_ret)
 {
        struct reparse_buffer_disk *rpbuf_disk =
                (struct reparse_buffer_disk*)rpbuf;
@@ -252,6 +253,7 @@ make_reparse_buffer(const struct reparse_data * restrict rpdata,
        *(utf16lechar*)data = cpu_to_le16(0);
        data += 2;
        rpbuf_disk->rpdatalen = cpu_to_le16(data - rpbuf - 8);
+       *rpbuflen_ret = data - rpbuf;
        return 0;
 }
 
@@ -399,6 +401,7 @@ wim_inode_set_symlink(struct wim_inode *inode,
        utf16lechar *name_utf16le;
        size_t name_utf16le_nbytes;
        int ret;
+       u16 rpbuflen;
 
        DEBUG("Creating reparse point data buffer for UNIX "
              "symlink target \"%s\"", target);
@@ -419,8 +422,8 @@ wim_inode_set_symlink(struct wim_inode *inode,
         * ways to provide Windows paths.)
         *
         * To change a UNIX relative symbolic link to Windows format, we only
-        * need to translate it to UTF-16LE and replace backslashes with forward
-        * slashes.  We do not make any attempt to handle filename character
+        * need to translate it to UTF-16LE and replace forward slashes with
+        * backslashes.  We do not make any attempt to handle filename character
         * problems, such as a link target that itself contains backslashes on
         * UNIX.  Then, for these relative links, we set the reparse header
         * @flags field to SYMBOLIC_LINK_RELATIVE.
@@ -481,11 +484,11 @@ wim_inode_set_symlink(struct wim_inode *inode,
                rpdata.rpflags = SYMBOLIC_LINK_RELATIVE;
        }
 
-       ret = make_reparse_buffer(&rpdata, (u8*)&rpbuf_disk);
+       ret = make_reparse_buffer(&rpdata, (u8*)&rpbuf_disk, &rpbuflen);
        if (ret == 0) {
                ret = inode_set_unnamed_stream(inode,
                                               (u8*)&rpbuf_disk + 8,
-                                              le16_to_cpu(rpbuf_disk.rpdatalen),
+                                              rpbuflen - 8,
                                               lookup_table);
        }
        FREE(name_utf16le);
@@ -513,12 +516,13 @@ unix_get_ino_and_dev(const char *path, u64 *ino_ret, u64 *dev_ret)
 
 #endif /* !defined(__WIN32__) */
 
+/* is_rp_path_separator() - characters treated as path separators in absolute
+ * symbolic link targets */
+
 #ifdef __WIN32__
-#  define RP_PATH_SEPARATOR L'\\'
 #  define is_rp_path_separator(c) ((c) == L'\\' || (c) == L'/')
 #  define os_get_ino_and_dev win32_get_file_and_vol_ids
 #else
-#  define RP_PATH_SEPARATOR '/'
 #  define is_rp_path_separator(c) ((c) == '/')
 #  define os_get_ino_and_dev unix_get_ino_and_dev
 #endif
@@ -560,7 +564,7 @@ capture_fixup_absolute_symlink(tchar *dest,
                        /* Link points inside capture root.  Return abbreviated
                         * path. */
                        if (*p == T('\0'))
-                               *(p - 1) = RP_PATH_SEPARATOR;
+                               *(p - 1) = OS_PREFERRED_PATH_SEPARATOR;
                        while (p - 1 >= dest && is_rp_path_separator(*(p - 1)))
                                p--;
                #ifdef __WIN32__