From 5684d46f92ac65ace1e8b45fb0e007f9efa0dfee Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Mon, 13 May 2013 22:24:06 -0500 Subject: [PATCH 1/1] dentry_find_streams_to_extract(): Handle hard links correctly --- src/dentry.h | 2 ++ src/extract_image.c | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/dentry.h b/src/dentry.h index 1500bd7c..a613db42 100644 --- a/src/dentry.h +++ b/src/dentry.h @@ -232,6 +232,8 @@ struct wim_inode { /* %true iff verify_inode() has run on this inode. */ u8 i_verified : 1; + u8 i_visited : 1; + /* Used only in NTFS-mode extraction */ u8 i_dos_name_extracted : 1; diff --git a/src/extract_image.c b/src/extract_image.c index 20b44ee2..fd7453aa 100644 --- a/src/extract_image.c +++ b/src/extract_image.c @@ -187,7 +187,8 @@ dentry_find_streams_to_extract(struct wim_dentry *dentry, void *_ctx) lte = inode_unnamed_lte_resolved(inode); if (lte) { - maybe_add_stream_for_extraction(lte, stream_list); + if (!inode->i_visited) + maybe_add_stream_for_extraction(lte, stream_list); list_add_tail(&dentry->tmp_list, <e->lte_dentry_list); dentry_added = true; } @@ -210,8 +211,10 @@ dentry_find_streams_to_extract(struct wim_dentry *dentry, void *_ctx) if (inode->i_ads_entries[i].stream_name_nbytes != 0) { lte = inode->i_ads_entries[i].lte; if (lte) { - maybe_add_stream_for_extraction(lte, - stream_list); + if (!inode->i_visited) { + maybe_add_stream_for_extraction(lte, + stream_list); + } if (!dentry_added) { list_add_tail(&dentry->tmp_list, <e->lte_dentry_list); @@ -221,6 +224,7 @@ dentry_find_streams_to_extract(struct wim_dentry *dentry, void *_ctx) } } } + inode->i_visited = 1; return 0; } @@ -259,6 +263,7 @@ static int dentry_reset_needs_extraction(struct wim_dentry *dentry, void *_ignore) { dentry->needs_extraction = 0; + dentry->d_inode->i_visited = 0; return 0; } -- 2.43.0