]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
xar: Fix dot dot handling
authorTobias Stoeckmann <tobias@stoeckmann.org>
Thu, 14 May 2026 18:22:48 +0000 (20:22 +0200)
committerTobias Stoeckmann <tobias@stoeckmann.org>
Thu, 14 May 2026 18:22:48 +0000 (20:22 +0200)
Port iso9660 dot dot handling over to xar.

Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
libarchive/archive_write_set_format_xar.c

index e7281d0b5965cae6c0d854b0106d23b748447d6a..c9d9d686df773e87f0a65af6340c4607b33216da 100644 (file)
@@ -2205,20 +2205,29 @@ file_gen_utility_names(struct archive_write *a, struct file *file)
                                 *     --> 'dir/dir2/'
                                 */
                                char *rp = p -1;
+                               size_t off;
+                               for (off = 4; p[off] == '/'; off++)
+                                       ;
                                while (rp >= dirname) {
                                        if (*rp == '/')
                                                break;
                                        --rp;
                                }
                                if (rp > dirname) {
-                                       memmove(rp, p+3, strlen(p+3) + 1);
+                                       memmove(rp + 1, p + off, strlen(p + off) + 1);
                                        p = rp;
                                } else {
-                                       memmove(dirname, p+4, strlen(p+4) + 1);
+                                       memmove(dirname, p + off, strlen(p + off) + 1);
                                        p = dirname;
                                }
                        } else
                                p++;
+               } else if (p == dirname && p[0] == '.' && p[1] == '.' && p[2] == '/') {
+                       size_t off;
+                       for (off = 3; p[off] == '/'; off++)
+                               ;
+                       memmove(dirname, p + off, strlen(p + off) + 1);
+                       p = dirname;
                } else
                        p++;
        }