rans_fuzzer.cc (1581B)
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 "lib/jxl/base/span.h" 7 #include "lib/jxl/base/status.h" 8 #include "lib/jxl/dec_ans.h" 9 #include "lib/jxl/dec_bit_reader.h" 10 #include "lib/jxl/entropy_coder.h" 11 12 namespace jpegxl { 13 namespace tools { 14 15 using ::jxl::ANSCode; 16 using ::jxl::ANSSymbolReader; 17 using ::jxl::BitReader; 18 using ::jxl::BitReaderScopedCloser; 19 using ::jxl::Bytes; 20 using ::jxl::Status; 21 22 int TestOneInput(const uint8_t* data, size_t size) { 23 if (size < 2) return 0; 24 size_t numContexts = data[0] * 256 * data[1] + 1; 25 data += 2; 26 size -= 2; 27 28 std::vector<uint8_t> context_map; 29 Status ret = true; 30 { 31 BitReader br(Bytes(data, size)); 32 BitReaderScopedCloser br_closer(&br, &ret); 33 ANSCode code; 34 JXL_RETURN_IF_ERROR( 35 DecodeHistograms(&br, numContexts, &code, &context_map)); 36 ANSSymbolReader ansreader(&code, &br); 37 38 // Limit the maximum amount of reads to avoid (valid) infinite loops. 39 const size_t maxreads = size * 8; 40 size_t numreads = 0; 41 int context = 0; 42 while (jxl::DivCeil(br.TotalBitsConsumed(), jxl::kBitsPerByte) < size && 43 numreads <= maxreads) { 44 int code = ansreader.ReadHybridUint(context, &br, context_map); 45 context = code % numContexts; 46 numreads++; 47 } 48 } 49 50 return 0; 51 } 52 53 } // namespace tools 54 } // namespace jpegxl 55 56 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { 57 return jpegxl::tools::TestOneInput(data, size); 58 }