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

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

index 0a00a3550bbd2d55c6b01bbd3d8d9f8f8311b781..1c6c13fc655f2ddd2152831d2a1c0300d2acba8e 100644 (file)
@@ -1884,20 +1884,29 @@ mtree_entry_setup_filenames(struct archive_write *a, struct mtree_entry *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) {
-                                       strcpy(rp, p+3);
+                                       memmove(rp + 1, p + off, strlen(p + off) + 1);
                                        p = rp;
                                } else {
-                                       strcpy(dirname, p+4);
+                                       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++;
        }