From 2fa590c75e9433779557999870f0c8136157c2b7 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Sun, 17 Nov 2013 21:35:13 -0600 Subject: [PATCH] wimlib_mount_image(): Correctly handle unnamed stream in ADS entries --- include/wimlib/lookup_table.h | 3 +++ src/lookup_table.c | 14 +++++++++++--- src/mount_image.c | 2 +- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/include/wimlib/lookup_table.h b/include/wimlib/lookup_table.h index 48ee9fc5..6a14daaa 100644 --- a/include/wimlib/lookup_table.h +++ b/include/wimlib/lookup_table.h @@ -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); diff --git a/src/lookup_table.c b/src/lookup_table.c index 98433ae0..9109c481 100644 --- a/src/lookup_table.c +++ b/src/lookup_table.c @@ -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) diff --git a/src/mount_image.c b/src/mount_image.c index 37bc68ce..ce4a5843 100644 --- a/src/mount_image.c +++ b/src/mount_image.c @@ -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, -- 2.43.0