libjxl

FORK: libjxl patches used on blog
git clone https://git.neptards.moe/blog/libjxl.git
Log | Files | Refs | Submodules | README | LICENSE

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 }