capture_ntfs_streams(): Fix reparse tag capture bug
authorEric Biggers <ebiggers3@gmail.com>
Wed, 6 Feb 2013 02:23:59 +0000 (20:23 -0600)
committerEric Biggers <ebiggers3@gmail.com>
Wed, 6 Feb 2013 02:23:59 +0000 (20:23 -0600)
The reparse tag will be incorrectly left 0 if a reparse point data buffer is
identical to an existing stream.  Fix it.

src/ntfs-apply.c
src/ntfs-capture.c

index 31b8423..fcf141f 100644 (file)
@@ -338,6 +338,7 @@ static int apply_reparse_data(ntfs_inode *ni, const struct wim_dentry *dentry,
        u8 reparse_data_buf[8 + wim_resource_size(lte)];
        u8 *p = reparse_data_buf;
        p = put_u32(p, dentry->d_inode->i_reparse_tag); /* ReparseTag */
+       DEBUG("ReparseTag = %#x", dentry->d_inode->i_reparse_tag);
        p = put_u16(p, wim_resource_size(lte)); /* ReparseDataLength */
        p = put_u16(p, 0); /* Reserved */
 
index b3f79eb..9861523 100644 (file)
@@ -222,6 +222,7 @@ static int ntfs_attr_sha1sum(ntfs_inode *ni, ATTR_RECORD *ar,
                if (ntfs_attr_pread(na, 0, 8, buf) != 8)
                        goto out_error;
                *reparse_tag_ret = le32_to_cpu(*(u32*)buf);
+               DEBUG("ReparseTag = %#x", *reparse_tag_ret);
                pos = 8;
                bytes_remaining -= 8;
        }
@@ -298,6 +299,9 @@ static int capture_ntfs_streams(struct wim_dentry *dentry, ntfs_inode *ni,
                        if (ret != 0)
                                goto out_put_actx;
 
+                       if (type == AT_REPARSE_POINT)
+                               dentry->d_inode->i_reparse_tag = reparse_tag;
+
                        /* Make a lookup table entry for the stream, or use an existing
                         * one if there's already an identical stream. */
                        lte = __lookup_resource(lookup_table, attr_hash);
@@ -329,7 +333,6 @@ static int capture_ntfs_streams(struct wim_dentry *dentry, ntfs_inode *ni,
                                lte->ntfs_loc = ntfs_loc;
                                lte->resource_location = RESOURCE_IN_NTFS_VOLUME;
                                if (type == AT_REPARSE_POINT) {
-                                       dentry->d_inode->i_reparse_tag = reparse_tag;
                                        ntfs_loc->is_reparse_point = true;
                                        lte->resource_entry.original_size = data_size - 8;
                                        lte->resource_entry.size = data_size - 8;