/src/libjxl/tools/fields_fuzzer.cc
Line | Count | Source |
1 | | // Copyright (c) the JPEG XL Project Authors. All rights reserved. |
2 | | // |
3 | | // Use of this source code is governed by a BSD-style |
4 | | // license that can be found in the LICENSE file. |
5 | | |
6 | | #include <cstddef> |
7 | | #include <cstdint> |
8 | | #include <vector> |
9 | | |
10 | | #include "lib/jxl/base/span.h" |
11 | | #include "lib/jxl/color_encoding_internal.h" |
12 | | #include "lib/jxl/dec_ans.h" |
13 | | #include "lib/jxl/dec_bit_reader.h" |
14 | | #include "lib/jxl/fields.h" |
15 | | #include "lib/jxl/frame_header.h" |
16 | | #include "lib/jxl/fuzztest.h" |
17 | | #include "lib/jxl/headers.h" |
18 | | #include "lib/jxl/image_metadata.h" |
19 | | #include "lib/jxl/jpeg/jpeg_data.h" |
20 | | #include "lib/jxl/loop_filter.h" |
21 | | #include "lib/jxl/modular/encoding/context_predict.h" |
22 | | #include "lib/jxl/modular/encoding/encoding.h" |
23 | | #include "lib/jxl/modular/transform/squeeze_params.h" |
24 | | #include "lib/jxl/modular/transform/transform.h" |
25 | | #include "lib/jxl/quantizer.h" |
26 | | |
27 | | namespace { |
28 | | |
29 | | using ::jxl::BitReader; |
30 | | using ::jxl::Bytes; |
31 | | using ::jxl::CodecMetadata; |
32 | | using ::jxl::CustomTransformData; |
33 | | using ::jxl::ImageMetadata; |
34 | | using ::jxl::SizeHeader; |
35 | | |
36 | 2.82k | int DoTestOneInput(const uint8_t* data, size_t size) { |
37 | | // Global parameters used by some headers. |
38 | 2.82k | CodecMetadata codec_metadata; |
39 | | |
40 | | // First byte controls which header to parse. |
41 | 2.82k | if (size == 0) return 0; |
42 | 2.82k | BitReader reader(Bytes(data + 1, size - 1)); |
43 | 2.82k | #define FUZZER_CASE_HEADER(number, classname, ...) \ |
44 | 2.82k | case number: { \ |
45 | 2.54k | ::jxl::classname header{__VA_ARGS__}; \ |
46 | 2.54k | (void)jxl::Bundle::Read(&reader, &header); \ |
47 | 2.54k | break; \ |
48 | 2.54k | } |
49 | 2.82k | switch (data[0]) { |
50 | 11 | case 0: { |
51 | 11 | SizeHeader size_header; |
52 | 11 | (void)jxl::ReadSizeHeader(&reader, &size_header); |
53 | 11 | break; |
54 | 0 | } |
55 | | |
56 | 181 | case 1: { |
57 | 181 | ImageMetadata metadata; |
58 | 181 | (void)jxl::ReadImageMetadata(&reader, &metadata); |
59 | 181 | break; |
60 | 0 | } |
61 | | |
62 | 440 | FUZZER_CASE_HEADER(2, FrameHeader, &codec_metadata) |
63 | 1.01k | FUZZER_CASE_HEADER(3, jpeg::JPEGData) |
64 | 1 | FUZZER_CASE_HEADER(4, AnimationFrame, &codec_metadata) |
65 | 13 | FUZZER_CASE_HEADER(5, AnimationHeader) |
66 | 18 | FUZZER_CASE_HEADER(6, BitDepth) |
67 | 6 | FUZZER_CASE_HEADER(7, BlendingInfo) |
68 | 202 | FUZZER_CASE_HEADER(8, ColorEncoding) |
69 | 67 | FUZZER_CASE_HEADER(9, CustomTransferFunction) |
70 | 4 | FUZZER_CASE_HEADER(10, Customxy) |
71 | 61 | FUZZER_CASE_HEADER(11, ExtraChannelInfo) |
72 | 100 | FUZZER_CASE_HEADER(12, GroupHeader) |
73 | 5 | FUZZER_CASE_HEADER(13, weighted::Header) |
74 | 485 | FUZZER_CASE_HEADER(14, LoopFilter) |
75 | 5 | FUZZER_CASE_HEADER(15, LZ77Params) |
76 | 8 | FUZZER_CASE_HEADER(16, OpsinInverseMatrix) |
77 | 34 | FUZZER_CASE_HEADER(17, Passes) |
78 | 6 | FUZZER_CASE_HEADER(18, PreviewHeader) |
79 | 5 | FUZZER_CASE_HEADER(19, QuantizerParams) |
80 | 3 | FUZZER_CASE_HEADER(20, SqueezeParams) |
81 | 17 | FUZZER_CASE_HEADER(21, ToneMapping) |
82 | 50 | FUZZER_CASE_HEADER(22, Transform) |
83 | 6 | FUZZER_CASE_HEADER(23, YCbCrChromaSubsampling) |
84 | | |
85 | 81 | default: { |
86 | 81 | CustomTransformData transform_data; |
87 | 81 | transform_data.nonserialized_xyb_encoded = true; |
88 | 81 | (void)jxl::Bundle::Read(&reader, &transform_data); |
89 | 81 | break; |
90 | 0 | } |
91 | 2.82k | } |
92 | 2.82k | (void)reader.Close(); |
93 | | |
94 | 2.82k | return 0; |
95 | 2.82k | } |
96 | | |
97 | | } // namespace |
98 | | |
99 | 53.8k | extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
100 | 53.8k | return DoTestOneInput(data, size); |
101 | 53.8k | } |
102 | | |
103 | 0 | void TestOneInput(const std::vector<uint8_t>& data) { |
104 | 0 | DoTestOneInput(data.data(), data.size()); |
105 | 0 | } |
106 | | |
107 | | FUZZ_TEST(FieldsFuzzTest, TestOneInput); |