Skip to content

Commit

Permalink
[test] fix fuzz tests that might crash on duplicate settings params (e…
Browse files Browse the repository at this point in the history
…nvoyproxy#10779)

Signed-off-by: Asra Ali <asraa@google.com>
  • Loading branch information
asraa committed Apr 20, 2020
1 parent 2079b29 commit 6272c0b
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 7 deletions.
23 changes: 16 additions & 7 deletions test/common/http/http2/codec_impl_test_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,27 +13,36 @@ class TestCodecSettingsProvider {
public:
// Returns the value of the SETTINGS parameter keyed by |identifier| sent by the remote endpoint.
absl::optional<uint32_t> 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:
// Stores SETTINGS parameters contained in |settings_frame| to make them available via
// 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<nghttp2_settings_entry, ::Envoy::Http2::Utility::SettingsEntryHash,
::Envoy::Http2::Utility::SettingsEntryEquals>
settings_;
std::unordered_map<int32_t, uint32_t> settings_;
};

class TestServerConnectionImpl : public ServerConnectionImpl, public TestCodecSettingsProvider {
Expand Down
Binary file not shown.

0 comments on commit 6272c0b

Please sign in to comment.