From: Eric Biggers Date: Tue, 14 May 2013 03:24:06 +0000 (-0500) Subject: dentry_find_streams_to_extract(): Handle hard links correctly X-Git-Tag: v1.4.0~67 X-Git-Url: https://wimlib.net/git/?p=wimlib;a=commitdiff_plain;h=5684d46f92ac65ace1e8b45fb0e007f9efa0dfee;hp=ed0920c59c0dfe0ba82e61f2a03d4d1639a218b4 dentry_find_streams_to_extract(): Handle hard links correctly --- 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; }