]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Do not try finding hardlinked files which are resolved.
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>
Sun, 6 Dec 2009 16:00:34 +0000 (11:00 -0500)
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>
Sun, 6 Dec 2009 16:00:34 +0000 (11:00 -0500)
SVN-Revision: 1707

libarchive/archive_read_support_format_xar.c

index 2fb62a091e71d30f481ffb8c1fe77901d5a891bc..f4425fb6e526002ff30e1ce9fcc73f5b3cfb6680 100644 (file)
@@ -596,26 +596,31 @@ read_toc(struct archive_read *a)
         * Connect hardlinked files.
         */
        for (i = 0; i < xar->file_queue.used; i++) {
-               struct hdlink *hdlink;
+               struct hdlink **hdlink;
                struct xar_file *file;
 
                file = xar->file_queue.files[i];
                /* Check if 'file' is a target file of the hardlink. */
                if (file->link != (unsigned int)-1)
                        continue;
-               for (hdlink = xar->hdlink_list; hdlink != NULL;
-                   hdlink = hdlink->next) {
-                       if (hdlink->id == file->id) {
+               for (hdlink = &(xar->hdlink_list); *hdlink != NULL;
+                   hdlink = &((*hdlink)->next)) {
+                       if ((*hdlink)->id == file->id) {
+                               struct hdlink *hltmp;
                                struct xar_file *f2;
-                               int nlink = hdlink->cnt + 1;
+                               int nlink = (*hdlink)->cnt + 1;
 
                                file->nlink = nlink;
-                               for (f2 = hdlink->files; f2 != NULL;
+                               for (f2 = (*hdlink)->files; f2 != NULL;
                                    f2 = f2->hdnext) {
                                        f2->nlink = nlink;
                                        archive_string_copy(
                                            &(f2->hardlink), &(file->pathname));
                                }
+                               /* Remove resolved files from hdlist_list. */
+                               hltmp = *hdlink;
+                               *hdlink = hltmp->next;
+                               free(hltmp);
                                break;
                        }
                }