Coverage Report

Created: 2025-11-16 07:46

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.47k
{
14
7.47k
    auto checksum = 0u;
15
7.47k
    u8 const* u8_this = reinterpret_cast<u8 const*>(this);
16
7.47k
    u8 const* u8_m_checksum = reinterpret_cast<u8 const*>(&m_checksum);
17
3.74M
    for (auto i = 0u; i < sizeof(TarFileHeader); ++i) {
18
3.73M
        if (u8_this + i >= u8_m_checksum && u8_this + i < u8_m_checksum + sizeof(m_checksum)) {
19
59.7k
            checksum += ' ';
20
3.67M
        } else {
21
3.67M
            checksum += u8_this[i];
22
3.67M
        }
23
3.73M
    }
24
7.47k
    return checksum;
25
7.47k
}
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.16k
{
40
8.16k
    u8 const* buffer = reinterpret_cast<u8 const*>(this);
41
413k
    for (size_t i = 0; i < sizeof(TarFileHeader); ++i) {
42
412k
        if (buffer[i] != 0)
43
7.48k
            return false;
44
412k
    }
45
684
    return true;
46
8.16k
}
47
48
bool TarFileHeader::content_is_like_extended_header() const
49
12.1k
{
50
12.1k
    return type_flag() == TarFileType::ExtendedHeader || type_flag() == TarFileType::GlobalExtendedHeader;
51
12.1k
}
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
}