From bd6c48f6ea5652be5087d9d879a45eb36b3a9a7d Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Wed, 10 Nov 2021 00:27:01 +0100 Subject: [PATCH] Utilities: tar: Always create parent directory when extracting --- Userland/Utilities/tar.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Userland/Utilities/tar.cpp b/Userland/Utilities/tar.cpp index 417f8cbdbf..8f077129f8 100644 --- a/Userland/Utilities/tar.cpp +++ b/Userland/Utilities/tar.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -75,10 +76,13 @@ int main(int argc, char** argv) Archive::TarFileStream file_stream = tar_stream.file_contents(); const Archive::TarFileHeader& header = tar_stream.header(); + String absolute_path = Core::File::absolute_path(header.filename()); switch (header.type_flag()) { case Archive::TarFileType::NormalFile: case Archive::TarFileType::AlternateNormalFile: { - int fd = open(String(header.filename()).characters(), O_CREAT | O_WRONLY, header.mode()); + Core::File::ensure_parent_directories(absolute_path); + + int fd = open(absolute_path.characters(), O_CREAT | O_WRONLY, header.mode()); if (fd < 0) { perror("open"); return 1; @@ -96,7 +100,9 @@ int main(int argc, char** argv) break; } case Archive::TarFileType::Directory: { - if (mkdir(String(header.filename()).characters(), header.mode())) { + Core::File::ensure_parent_directories(absolute_path); + + if (mkdir(absolute_path.characters(), header.mode())) { perror("mkdir"); return 1; }