Coverage Report

Created: 2026-09-28 07:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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);