]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix pathname overwrite in header_old_tar() (#2360)
authorMartin Matuška <martin@matuska.org>
Mon, 7 Oct 2024 03:31:38 +0000 (05:31 +0200)
committerGitHub <noreply@github.com>
Mon, 7 Oct 2024 03:31:38 +0000 (20:31 -0700)
Fixes #2359

libarchive/archive_read_support_format_tar.c

index 4f42db8f0efe64448b180e81640d71e1f3d34a0d..5517198edd9291a044ebba556a09bbbdc16948dd 100644 (file)
@@ -1520,9 +1520,17 @@ header_old_tar(struct archive_read *a, struct tar *tar,
        const struct archive_entry_header_ustar *header;
        int err = ARCHIVE_OK, err2;
 
-       /* Copy filename over (to ensure null termination). */
+       /*
+        * Copy filename over (to ensure null termination).
+        * Skip if pathname was already set e.g. by header_gnu_longname()
+        */
        header = (const struct archive_entry_header_ustar *)h;
-       if (archive_entry_copy_pathname_l(entry,
+
+       const char *existing_pathname = archive_entry_pathname(entry);
+       const wchar_t *existing_wcs_pathname = archive_entry_pathname_w(entry);
+       if ((existing_pathname == NULL || existing_pathname[0] == '\0')
+           && (existing_wcs_pathname == NULL || existing_wcs_pathname[0] == '\0') &&
+           archive_entry_copy_pathname_l(entry,
            header->name, sizeof(header->name), tar->sconv) != 0) {
                err = set_conversion_failed_error(a, tar->sconv, "Pathname");
                if (err == ARCHIVE_FATAL)