svn commit: r201163 - head/lib/libarchive

Tim Kientzle kientzle at FreeBSD.org
Tue Dec 29 05:50:35 UTC 2009


Author: kientzle
Date: Tue Dec 29 05:50:34 2009
New Revision: 201163
URL: http://svn.freebsd.org/changeset/base/201163

Log:
  Be a little more skeptical of dev/ino matches when reading cpio files.
  This eliminates some false-positives in the hardlink detection logic.

Modified:
  head/lib/libarchive/archive_read_support_format_cpio.c

Modified: head/lib/libarchive/archive_read_support_format_cpio.c
==============================================================================
--- head/lib/libarchive/archive_read_support_format_cpio.c	Tue Dec 29 05:47:46 2009	(r201162)
+++ head/lib/libarchive/archive_read_support_format_cpio.c	Tue Dec 29 05:50:34 2009	(r201163)
@@ -92,7 +92,7 @@ struct links_entry {
         struct links_entry      *previous;
         int                      links;
         dev_t                    dev;
-        ino_t                    ino;
+        int64_t                  ino;
         char                    *name;
 };
 
@@ -727,51 +727,51 @@ atol16(const char *p, unsigned char_cnt)
 static void
 record_hardlink(struct cpio *cpio, struct archive_entry *entry)
 {
-        struct links_entry      *le;
+	struct links_entry      *le;
 	dev_t dev;
-	ino_t ino;
+	int64_t ino;
 
 	if (archive_entry_nlink(entry) <= 1)
 		return;
 
 	dev = archive_entry_dev(entry);
-	ino = archive_entry_ino(entry);
+	ino = archive_entry_ino64(entry);
 
-        /*
-         * First look in the list of multiply-linked files.  If we've
-         * already dumped it, convert this entry to a hard link entry.
-         */
-        for (le = cpio->links_head; le; le = le->next) {
-                if (le->dev == dev && le->ino == ino) {
-                        archive_entry_copy_hardlink(entry, le->name);
-
-                        if (--le->links <= 0) {
-                                if (le->previous != NULL)
-                                        le->previous->next = le->next;
-                                if (le->next != NULL)
-                                        le->next->previous = le->previous;
-                                if (cpio->links_head == le)
-                                        cpio->links_head = le->next;
+	/*
+	 * First look in the list of multiply-linked files.  If we've
+	 * already dumped it, convert this entry to a hard link entry.
+	 */
+	for (le = cpio->links_head; le; le = le->next) {
+		if (le->dev == dev && le->ino == ino) {
+			archive_entry_copy_hardlink(entry, le->name);
+
+			if (--le->links <= 0) {
+				if (le->previous != NULL)
+					le->previous->next = le->next;
+				if (le->next != NULL)
+					le->next->previous = le->previous;
+				if (cpio->links_head == le)
+					cpio->links_head = le->next;
 				free(le->name);
-                                free(le);
-                        }
+				free(le);
+			}
 
-                        return;
-                }
-        }
+			return;
+		}
+	}
 
-        le = (struct links_entry *)malloc(sizeof(struct links_entry));
+	le = (struct links_entry *)malloc(sizeof(struct links_entry));
 	if (le == NULL)
 		__archive_errx(1, "Out of memory adding file to list");
-        if (cpio->links_head != NULL)
-                cpio->links_head->previous = le;
-        le->next = cpio->links_head;
-        le->previous = NULL;
-        cpio->links_head = le;
-        le->dev = dev;
-        le->ino = ino;
-        le->links = archive_entry_nlink(entry) - 1;
-        le->name = strdup(archive_entry_pathname(entry));
+	if (cpio->links_head != NULL)
+		cpio->links_head->previous = le;
+	le->next = cpio->links_head;
+	le->previous = NULL;
+	cpio->links_head = le;
+	le->dev = dev;
+	le->ino = ino;
+	le->links = archive_entry_nlink(entry) - 1;
+	le->name = strdup(archive_entry_pathname(entry));
 	if (le->name == NULL)
 		__archive_errx(1, "Out of memory adding file to list");
 }


More information about the svn-src-head mailing list