gfe-relnote: Abandons HPACK decompression for overly large header blocks. Protected by default-true --gfe2_reloadable_flag_http2_reject_too_large_header_blocks.
PiperOrigin-RevId: 259607264
Change-Id: I718fc440535289e1d8fb6d6e4febdbf8ed8d9d75
diff --git a/spdy/core/hpack/hpack_decoder_adapter.cc b/spdy/core/hpack/hpack_decoder_adapter.cc
index ad05b1f..278eaab 100644
--- a/spdy/core/hpack/hpack_decoder_adapter.cc
+++ b/spdy/core/hpack/hpack_decoder_adapter.cc
@@ -21,6 +21,7 @@
HpackDecoderAdapter::HpackDecoderAdapter()
: hpack_decoder_(&listener_adapter_, kMaxDecodeBufferSizeBytes),
max_decode_buffer_size_bytes_(kMaxDecodeBufferSizeBytes),
+ max_header_block_bytes_(0),
header_block_started_(false) {}
HpackDecoderAdapter::~HpackDecoderAdapter() = default;
@@ -64,6 +65,10 @@
return false;
}
listener_adapter_.AddToTotalHpackBytes(headers_data_length);
+ if (max_header_block_bytes_ != 0 &&
+ listener_adapter_.total_hpack_bytes() > max_header_block_bytes_) {
+ return false;
+ }
http2::DecodeBuffer db(headers_data, headers_data_length);
bool ok = hpack_decoder_.DecodeFragment(&db);
DCHECK(!ok || db.Empty()) << "Remaining=" << db.Remaining();
@@ -109,6 +114,11 @@
hpack_decoder_.set_max_string_size_bytes(max_decode_buffer_size_bytes);
}
+void HpackDecoderAdapter::set_max_header_block_bytes(
+ size_t max_header_block_bytes) {
+ max_header_block_bytes_ = max_header_block_bytes;
+}
+
size_t HpackDecoderAdapter::EstimateMemoryUsage() const {
return SpdyEstimateMemoryUsage(hpack_decoder_);
}