From cb48b9bc309a16f50d8be7370a56c127c7615369 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Mon, 28 Nov 2022 19:11:30 +0100 Subject: [PATCH] LibArchive: Pass along errors from Tar header checksum validation --- Userland/Libraries/LibArchive/TarStream.cpp | 11 ++++------- Userland/Libraries/LibArchive/TarStream.h | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Userland/Libraries/LibArchive/TarStream.cpp b/Userland/Libraries/LibArchive/TarStream.cpp index 2d917682c4..87928ffac8 100644 --- a/Userland/Libraries/LibArchive/TarStream.cpp +++ b/Userland/Libraries/LibArchive/TarStream.cpp @@ -94,8 +94,8 @@ ErrorOr TarInputStream::load_next_header() if (header_span.size() != sizeof(m_header)) return Error::from_string_literal("Failed to read the entire header"); - if (!valid()) - return Error::from_string_literal("Header is not valid"); + if (!TRY(valid())) + return Error::from_string_literal("Header has an invalid magic or checksum"); // Discard the rest of the header block. TRY(m_stream->discard(block_size - sizeof(TarFileHeader))); @@ -103,7 +103,7 @@ ErrorOr TarInputStream::load_next_header() return {}; } -bool TarInputStream::valid() const +ErrorOr TarInputStream::valid() const { auto const header_magic = header().magic(); auto const header_version = header().version(); @@ -114,10 +114,7 @@ bool TarInputStream::valid() const return false; // POSIX.1-1988 tar does not have magic numbers, so we also need to verify the header checksum. - if (header().checksum().is_error()) - return false; - - return header().checksum().release_value() == header().expected_checksum(); + return TRY(header().checksum()) == header().expected_checksum(); } TarFileStream TarInputStream::file_contents() diff --git a/Userland/Libraries/LibArchive/TarStream.h b/Userland/Libraries/LibArchive/TarStream.h index ac19015799..46fd6e44ef 100644 --- a/Userland/Libraries/LibArchive/TarStream.h +++ b/Userland/Libraries/LibArchive/TarStream.h @@ -36,7 +36,7 @@ public: static ErrorOr> construct(NonnullOwnPtr); ErrorOr advance(); bool finished() const { return m_stream->is_eof(); } - bool valid() const; + ErrorOr valid() const; TarFileHeader const& header() const { return m_header; } TarFileStream file_contents();