/src/serenity/Meta/Lagom/Fuzzers/FuzzTar.cpp
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2022, Idan Horowitz <idan.horowitz@serenityos.org> |
3 | | * |
4 | | * SPDX-License-Identifier: BSD-2-Clause |
5 | | */ |
6 | | |
7 | | #include <AK/MemoryStream.h> |
8 | | #include <AK/NonnullOwnPtr.h> |
9 | | #include <LibArchive/TarStream.h> |
10 | | #include <stdio.h> |
11 | | |
12 | | extern "C" int LLVMFuzzerTestOneInput(uint8_t const* data, size_t size) |
13 | 419 | { |
14 | 419 | AK::set_debug_enabled(false); |
15 | | |
16 | 419 | auto input_stream_or_error = try_make<FixedMemoryStream>(ReadonlyBytes { data, size }); |
17 | | |
18 | 419 | if (input_stream_or_error.is_error()) |
19 | 0 | return 0; |
20 | | |
21 | 419 | auto tar_stream_or_error = Archive::TarInputStream::construct(input_stream_or_error.release_value()); |
22 | | |
23 | 419 | if (tar_stream_or_error.is_error()) |
24 | 12 | return 0; |
25 | | |
26 | 407 | auto tar_stream = tar_stream_or_error.release_value(); |
27 | | |
28 | 7.35k | while (!tar_stream->finished()) { |
29 | 7.28k | auto const& header = tar_stream->header(); |
30 | | |
31 | 7.28k | if (!header.content_is_like_extended_header()) { |
32 | 2.53k | if (tar_stream->advance().is_error()) |
33 | 48 | return 0; |
34 | 2.48k | else |
35 | 2.48k | continue; |
36 | 2.53k | } |
37 | | |
38 | 4.75k | switch (header.type_flag()) { |
39 | 983 | case Archive::TarFileType::GlobalExtendedHeader: |
40 | 4.75k | case Archive::TarFileType::ExtendedHeader: { |
41 | 4.99k | auto result = tar_stream->for_each_extended_header([&](StringView, StringView) { }); |
42 | 4.75k | if (result.is_error()) |
43 | 201 | return 0; |
44 | 4.55k | break; |
45 | 4.75k | } |
46 | 4.55k | default: |
47 | 0 | return 0; |
48 | 4.75k | } |
49 | | |
50 | 4.55k | if (tar_stream->advance().is_error()) |
51 | 92 | return 0; |
52 | 4.55k | } |
53 | | |
54 | 66 | return 0; |
55 | 407 | } |