From 6c1322bdc7d6eb7648baed8a63768863e6536007 Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Sat, 13 Mar 2021 01:32:31 +0200 Subject: [PATCH] LibTar: Support ustar tar format Since we ignore both the ustar prefix field and the gnu extended header right now anyways, we can just accept both formats as the rest of the header is exactly the same. --- Userland/Libraries/LibTar/Tar.h | 10 +++++++--- Userland/Libraries/LibTar/TarStream.cpp | 5 ++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibTar/Tar.h b/Userland/Libraries/LibTar/Tar.h index 3ca46b3ca2..ce06f56844 100644 --- a/Userland/Libraries/LibTar/Tar.h +++ b/Userland/Libraries/LibTar/Tar.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Peter Elliott + * Copyright (c) 2021, Idan Horowitz * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,7 +47,10 @@ enum FileType { }; constexpr size_t block_size = 512; -constexpr const char* ustar_magic = "ustar "; +constexpr const char* gnu_magic = "ustar "; // gnu format magic +constexpr const char* gnu_version = " "; // gnu format version +constexpr const char* ustar_magic = "ustar"; // ustar format magic +constexpr const char* ustar_version = "00"; // ustar format version class Header { public: @@ -60,8 +64,8 @@ public: time_t timestamp() const { return get_tar_field(m_timestamp); } FileType type_flag() const { return FileType(m_type_flag); } const StringView link_name() const { return m_link_name; } - const StringView magic() const { return StringView(m_magic, sizeof(m_magic)); } - const StringView version() const { return StringView(m_version, sizeof(m_version)); } + const StringView magic() const { return StringView(m_magic, min(__builtin_strlen(m_magic), sizeof(m_magic))); } // in some cases this is a null terminated string, in others its not + const StringView version() const { return StringView(m_version, min(__builtin_strlen(m_version), sizeof(m_version))); } // in some cases this is a null terminated string, in others its not const StringView owner_name() const { return m_owner_name; } const StringView group_name() const { return m_group_name; } int major() const { return get_tar_field(m_major); } diff --git a/Userland/Libraries/LibTar/TarStream.cpp b/Userland/Libraries/LibTar/TarStream.cpp index ca4f60ada3..bccc225a7b 100644 --- a/Userland/Libraries/LibTar/TarStream.cpp +++ b/Userland/Libraries/LibTar/TarStream.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Peter Elliott + * Copyright (c) 2021, Idan Horowitz * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -120,7 +121,9 @@ void TarStream::advance() bool TarStream::valid() const { - return header().magic() == ustar_magic; + auto& header_magic = header().magic(); + auto& header_version = header().version(); + return (header_magic == gnu_magic && header_version == gnu_version) || (header_magic == ustar_magic && header_version == ustar_version); } TarFileStream TarStream::file_contents()