]> wimlib.net Git - wimlib/commitdiff
wimlib_mount_image(): Correctly handle unnamed stream in ADS entries
authorEric Biggers <ebiggers3@gmail.com>
Mon, 18 Nov 2013 03:35:13 +0000 (21:35 -0600)
committerEric Biggers <ebiggers3@gmail.com>
Mon, 18 Nov 2013 03:35:13 +0000 (21:35 -0600)
include/wimlib/lookup_table.h
src/lookup_table.c
src/mount_image.c

index 48ee9fc51196701f123697366476644c11a7ebfe..6a14daaa549c9f0c967c656ae7f6d9ad4318855e 100644 (file)
@@ -504,6 +504,9 @@ inode_stream_name_nbytes(const struct wim_inode *inode, unsigned stream_idx)
                return inode->i_ads_entries[stream_idx - 1].stream_name_nbytes;
 }
 
+extern struct wim_lookup_table_entry *
+inode_unnamed_stream_resolved(const struct wim_inode *inode, u16 *stream_idx_ret);
+
 extern struct wim_lookup_table_entry *
 inode_unnamed_lte_resolved(const struct wim_inode *inode);
 
index 98433ae0af664f37a2425108426a68ef67a1cf85..9109c481771fa1166e85220d53dc442fef3e6ca4 100644 (file)
@@ -1030,8 +1030,7 @@ wim_pathname_to_stream(WIMStruct *wim,
                        return -ENOENT;
                }
        } else {
-               lte = inode->i_lte;
-               stream_idx = 0;
+               lte = inode_unnamed_stream_resolved(inode, &stream_idx);
        }
 out:
        if (dentry_ret)
@@ -1170,19 +1169,28 @@ inode_stream_lte(const struct wim_inode *inode, unsigned stream_idx,
 }
 
 struct wim_lookup_table_entry *
-inode_unnamed_lte_resolved(const struct wim_inode *inode)
+inode_unnamed_stream_resolved(const struct wim_inode *inode, u16 *stream_idx_ret)
 {
        wimlib_assert(inode->i_resolved);
        for (unsigned i = 0; i <= inode->i_num_ads; i++) {
                if (inode_stream_name_nbytes(inode, i) == 0 &&
                    !is_zero_hash(inode_stream_hash_resolved(inode, i)))
                {
+                       *stream_idx_ret = i;
                        return inode_stream_lte_resolved(inode, i);
                }
        }
+       *stream_idx_ret = 0;
        return NULL;
 }
 
+struct wim_lookup_table_entry *
+inode_unnamed_lte_resolved(const struct wim_inode *inode)
+{
+       u16 stream_idx;
+       return inode_unnamed_stream_resolved(inode, &stream_idx);
+}
+
 struct wim_lookup_table_entry *
 inode_unnamed_lte_unresolved(const struct wim_inode *inode,
                             const struct wim_lookup_table *table)
index 37bc68ce0f56efa74d3e29601e516412a19179c6..ce4a58432d51f081256a26c550c1fb5d369895fa 100644 (file)
@@ -2242,7 +2242,7 @@ wimfs_unlink(const char *path)
        if (ret != 0)
                return ret;
 
-       if (stream_idx == 0)
+       if (inode_stream_name_nbytes(dentry->d_inode, stream_idx) == 0)
                remove_dentry(dentry, ctx->wim->lookup_table);
        else
                inode_remove_ads(dentry->d_inode, stream_idx - 1,