Coverage Report

Created: 2026-02-16 07:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/serenity/Userland/Libraries/LibArchive/Tar.cpp
Line
Count
Source
1
/*
2
 * Copyright (c) 2020, Peter Elliott <pelliott@serenityos.org>
3
 * Copyright (c) 2021, Idan Horowitz <idan.horowitz@serenityos.org>
4
 *
5
 * SPDX-License-Identifier: BSD-2-Clause
6
 */
7
8
#include "Tar.h"
9
10
namespace Archive {
11
12
unsigned TarFileHeader::expected_checksum() const
13
7.31k
{
14
7.31k
    auto checksum = 0u;
15
7.31k
    u8 const* u8_this = reinterpret_cast<u8 const*>(this);
16
7.31k
    u8 const* u8_m_checksum = reinterpret_cast<u8 const*>(&m_checksum);
17
3.66M
    for (auto i = 0u; i < sizeof(TarFileHeader); ++i) {
18
3.65M
        if (u8_this + i >= u8_m_checksum && u8_this + i < u8_m_checksum + sizeof(m_checksum)) {
19
58.5k
            checksum += ' ';
20
3.60M
        } else {
21
3.60M
            checksum += u8_this[i];
22
3.60M
        }
23
3.65M
    }
24
7.31k
    return checksum;
25
7.31k
}
26
27
ErrorOr<void> TarFileHeader::calculate_checksum()
28
0
{
29
0
    memset(m_checksum, ' ', sizeof(m_checksum));
30
31
0
    auto octal = TRY(String::formatted("{:06o}", expected_checksum()));
32
0
    bool copy_successful = octal.bytes_as_string_view().copy_characters_to_buffer(m_checksum, sizeof(m_checksum));
33
0
    VERIFY(copy_successful);
34
35
0
    return {};
36
0
}
37
38
bool TarFileHeader::is_zero_block() const
39
8.01k
{
40
8.01k
    u8 const* buffer = reinterpret_cast<u8 const*>(this);
41
424k
    for (size_t i = 0; i < sizeof(TarFileHeader); ++i) {
42
423k
        if (buffer[i] != 0)
43
7.33k
            return false;
44
423k
    }
45
687
    return true;
46
8.01k
}
47
48
bool TarFileHeader::content_is_like_extended_header() const
49
11.7k
{
50
11.7k
    return type_flag() == TarFileType::ExtendedHeader || type_flag() == TarFileType::GlobalExtendedHeader;
51
11.7k
}
52
53
void TarFileHeader::set_filename_and_prefix(StringView filename)
54
0
{
55
    // FIXME: Add support for extended tar headers for longer filenames.
56
0
    VERIFY(filename.length() <= sizeof(m_filename) + sizeof(m_prefix));
57
58
0
    if (filename.length() <= sizeof(m_filename)) {
59
0
        set_prefix(""sv);
60
0
        set_filename(filename);
61
0
        return;
62
0
    }
63
64
0
    Optional<size_t> slash = filename.find('/', filename.length() - sizeof(m_filename));
65
66
0
    VERIFY(slash.has_value());
67
0
    set_prefix(filename.substring_view(0, slash.value() + 1));
68
0
    set_filename(filename.substring_view(slash.value() + 1));
69
0
}
70
71
}