diff --git a/test/common/http/http2/codec_impl_test_util.h b/test/common/http/http2/codec_impl_test_util.h index c6d859056d8a7..3acfd7fc77f97 100644 --- a/test/common/http/http2/codec_impl_test_util.h +++ b/test/common/http/http2/codec_impl_test_util.h @@ -13,11 +13,11 @@ class TestCodecSettingsProvider { public: // Returns the value of the SETTINGS parameter keyed by |identifier| sent by the remote endpoint. absl::optional getRemoteSettingsParameterValue(int32_t identifier) const { - const auto it = settings_.find({identifier, 0}); + const auto it = settings_.find(identifier); if (it == settings_.end()) { return absl::nullopt; } - return it->value; + return it->second; } protected: @@ -25,15 +25,24 @@ class TestCodecSettingsProvider { // getRemoteSettingsParameterValue(). void onSettingsFrame(const nghttp2_settings& settings_frame) { for (uint32_t i = 0; i < settings_frame.niv; ++i) { - auto result = settings_.insert(settings_frame.iv[i]); - ASSERT(result.second); + auto result = settings_.insert( + std::make_pair(settings_frame.iv[i].settings_id, settings_frame.iv[i].value)); + // It is possible to have duplicate settings parameters, each new parameter replaces any + // existing value. + // https://tools.ietf.org/html/rfc7540#section-6.5 + if (!result.second) { + ENVOY_LOG_MISC(debug, "Duplicated settings parameter {} with value {}", + settings_frame.iv[i].settings_id, settings_frame.iv[i].value); + settings_.erase(result.first); + // Guaranteed success here. + settings_.insert( + std::make_pair(settings_frame.iv[i].settings_id, settings_frame.iv[i].value)); + } } } private: - std::unordered_set - settings_; + std::unordered_map settings_; }; class TestServerConnectionImpl : public ServerConnectionImpl, public TestCodecSettingsProvider { diff --git a/test/common/http/http2/request_header_corpus/clusterfuzz-testcase-minimized-request_header_fuzz_test-4795710559223808.fuzz b/test/common/http/http2/request_header_corpus/clusterfuzz-testcase-minimized-request_header_fuzz_test-4795710559223808.fuzz new file mode 100644 index 0000000000000..0325435ebd719 Binary files /dev/null and b/test/common/http/http2/request_header_corpus/clusterfuzz-testcase-minimized-request_header_fuzz_test-4795710559223808.fuzz differ