| // Copyright 2016 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "net/third_party/quiche/src/quic/core/qpack/qpack_decoder.h" | |
| #include <cstddef> | |
| #include <cstdint> | |
| #include <limits> | |
| #include "net/third_party/quiche/src/quic/core/qpack/qpack_decoder_test_utils.h" | |
| #include "net/third_party/quiche/src/quic/platform/api/quic_fuzzed_data_provider.h" | |
| #include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" | |
| namespace quic { | |
| namespace test { | |
| // This fuzzer exercises QpackDecoder. It should be able to cover all possible | |
| // code paths. There is no point in encoding QpackDecoder's output to turn this | |
| // into a roundtrip test, because the same header list can be encoded in many | |
| // different ways, so the output could not be expected to match the original | |
| // input. | |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | |
| NoOpHeadersHandler handler; | |
| QuicFuzzedDataProvider provider(data, size); | |
| // Process up to 64 kB fragments at a time. Too small upper bound might not | |
| // provide enough coverage, too large would make fuzzing less efficient. | |
| auto fragment_size_generator = | |
| std::bind(&QuicFuzzedDataProvider::ConsumeIntegralInRange<uint16_t>, | |
| &provider, 1, std::numeric_limits<uint16_t>::max()); | |
| NoopEncoderStreamErrorDelegate encoder_stream_error_delegate; | |
| NoopDecoderStreamSenderDelegate decoder_stream_sender_delegate; | |
| QpackDecode(&encoder_stream_error_delegate, &decoder_stream_sender_delegate, | |
| &handler, fragment_size_generator, | |
| provider.ConsumeRemainingBytesAsString()); | |
| return 0; | |
| } | |
| } // namespace test | |
| } // namespace quic |