From: Tim Kientzle Date: Sat, 14 Jun 2008 21:27:26 +0000 (-0400) Subject: Fix the link resolver to never match dirs as hardlinks. X-Git-Tag: v2.6.0~175 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a5cc8e384bff78752c99628766413aa179446e1e;p=thirdparty%2Flibarchive.git Fix the link resolver to never match dirs as hardlinks. In particular, this seems to fix some recent port build failures (the use of tar in these ports is rather bizarre, but it did work with tar's old link-matching code). Thanks to: Kris Kennaway SVN-Revision: 117 --- diff --git a/libarchive/archive_entry_link_resolver.c b/libarchive/archive_entry_link_resolver.c index f5176a446..84cd60850 100644 --- a/libarchive/archive_entry_link_resolver.c +++ b/libarchive/archive_entry_link_resolver.c @@ -181,6 +181,9 @@ archive_entry_linkify(struct archive_entry_linkresolver *res, /* If it has only one link, then we're done. */ if (archive_entry_nlink(*e) == 1) return; + /* Directories never have hardlinks. */ + if (archive_entry_filetype(*e) == AE_IFDIR) + return; switch (res->strategy) { case ARCHIVE_ENTRY_LINKIFY_LIKE_TAR: diff --git a/libarchive/test/test_link_resolver.c b/libarchive/test/test_link_resolver.c index a51e4a4dd..032c05951 100644 --- a/libarchive/test/test_link_resolver.c +++ b/libarchive/test/test_link_resolver.c @@ -68,6 +68,24 @@ static void test_linkify_tar(void) assertEqualInt(0, archive_entry_size(entry)); + /* Dirs should never be matched as hardlinks, regardless. */ + archive_entry_set_pathname(entry, "test3"); + archive_entry_set_nlink(entry, 2); + archive_entry_set_filetype(entry, AE_IFDIR); + archive_entry_set_ino(entry, 3); + archive_entry_set_hardlink(entry, NULL); + archive_entry_linkify(resolver, &entry, &e2); + /* Shouldn't be altered, since it wasn't seen before. */ + assert(e2 == NULL); + assertEqualString("test3", archive_entry_pathname(entry)); + assertEqualString(NULL, archive_entry_hardlink(entry)); + + /* Dir, so it shouldn't get matched. */ + archive_entry_linkify(resolver, &entry, &e2); + assert(e2 == NULL); + assertEqualString("test3", archive_entry_pathname(entry)); + assertEqualString(NULL, archive_entry_hardlink(entry)); + archive_entry_free(entry); archive_entry_linkresolver_free(resolver); }