Crash on invalid encoder or decoder stream data in qpack_round_trip_fuzzer.cc. Since encoder stream data is generated by QpackEncoder and decoder stream data is generated by QpackDecoder, data must not be corrupt. A crash would mean there is a bug in our implementation. gfe-relnote: n/a, change in QPACK fuzzer only. PiperOrigin-RevId: 262612270 Change-Id: I5b2d69b8bbceb25aec805f819cf2141cc744a970
diff --git a/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc b/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc index f44863b..84accd0 100644 --- a/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc +++ b/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc
@@ -7,8 +7,9 @@ #include <cstdint> #include <string> +#include "net/third_party/quiche/src/quic/core/qpack/qpack_decoder.h" #include "net/third_party/quiche/src/quic/core/qpack/qpack_decoder_test_utils.h" -#include "net/third_party/quiche/src/quic/core/qpack/qpack_encoder_test_utils.h" +#include "net/third_party/quiche/src/quic/core/qpack/qpack_encoder.h" #include "net/third_party/quiche/src/quic/core/qpack/qpack_utils.h" #include "net/third_party/quiche/src/quic/core/qpack/value_splitting_header_list.h" #include "net/third_party/quiche/src/quic/platform/api/quic_fuzzed_data_provider.h" @@ -17,6 +18,28 @@ namespace quic { namespace test { +// DecoderStreamErrorDelegate implementation that crashes on error. +class CrashingDecoderStreamErrorDelegate + : public QpackEncoder::DecoderStreamErrorDelegate { + public: + ~CrashingDecoderStreamErrorDelegate() override = default; + + void OnDecoderStreamError(QuicStringPiece error_message) override { + CHECK(false) << error_message; + } +}; + +// EncoderStreamErrorDelegate implementation that crashes on error. +class CrashingEncoderStreamErrorDelegate + : public QpackDecoder::EncoderStreamErrorDelegate { + public: + ~CrashingEncoderStreamErrorDelegate() override = default; + + void OnEncoderStreamError(QuicStringPiece error_message) override { + CHECK(false) << error_message; + } +}; + spdy::SpdyHeaderBlock GenerateHeaderList(QuicFuzzedDataProvider* provider) { spdy::SpdyHeaderBlock header_list; uint8_t header_count = provider->ConsumeIntegral<uint8_t>(); @@ -174,8 +197,7 @@ const uint64_t maximum_blocked_streams = provider.ConsumeIntegral<uint8_t>(); // Set up encoder. - // TODO: crash on decoder stream error - NoopDecoderStreamErrorDelegate decoder_stream_error_delegate; + CrashingDecoderStreamErrorDelegate decoder_stream_error_delegate; NoopQpackStreamSenderDelegate encoder_stream_sender_delegate; QpackEncoder encoder(&decoder_stream_error_delegate); encoder.set_qpack_stream_sender_delegate(&encoder_stream_sender_delegate); @@ -183,8 +205,7 @@ encoder.SetMaximumBlockedStreams(maximum_blocked_streams); // Set up decoder. - // TODO: crash on encoder stream error - NoopEncoderStreamErrorDelegate encoder_stream_error_delegate; + CrashingEncoderStreamErrorDelegate encoder_stream_error_delegate; NoopQpackStreamSenderDelegate decoder_stream_sender_delegate; QpackDecoder decoder(maximum_dynamic_table_capacity, maximum_blocked_streams, &encoder_stream_error_delegate);