From 988034be6aece7bd103249e18ac7f0a5d3f92545 Mon Sep 17 00:00:00 2001 From: Denys Otrishko Date: Mon, 18 Nov 2019 22:12:15 +0200 Subject: http2: make maximum tolerated rejected streams configurable PR-URL: https://github.com/nodejs/node/pull/30534 Fixes: https://github.com/nodejs/node/issues/30505 Reviewed-By: Anna Henningsen Reviewed-By: David Carlier Reviewed-By: James M Snell --- src/node_http2.cc | 4 +++- src/node_http2.h | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/node_http2.cc b/src/node_http2.cc index 459cc3b0e6..17a8a859d9 100644 --- a/src/node_http2.cc +++ b/src/node_http2.cc @@ -920,7 +920,8 @@ int Http2Session::OnBeginHeadersCallback(nghttp2_session* handle, if (UNLIKELY(!session->CanAddStream() || Http2Stream::New(session, id, frame->headers.cat) == nullptr)) { - if (session->rejected_stream_count_++ > 100) + if (session->rejected_stream_count_++ > + session->js_fields_.max_rejected_streams) return NGHTTP2_ERR_CALLBACK_FAILURE; // Too many concurrent streams being opened nghttp2_submit_rst_stream(**session, NGHTTP2_FLAG_NONE, id, @@ -3062,6 +3063,7 @@ void Initialize(Local target, NODE_DEFINE_CONSTANT(target, kSessionPriorityListenerCount); NODE_DEFINE_CONSTANT(target, kSessionFrameErrorListenerCount); NODE_DEFINE_CONSTANT(target, kSessionMaxInvalidFrames); + NODE_DEFINE_CONSTANT(target, kSessionMaxRejectedStreams); NODE_DEFINE_CONSTANT(target, kSessionUint8FieldCount); NODE_DEFINE_CONSTANT(target, kSessionHasRemoteSettingsListeners); diff --git a/src/node_http2.h b/src/node_http2.h index 79d648276f..e828999f2b 100644 --- a/src/node_http2.h +++ b/src/node_http2.h @@ -678,6 +678,7 @@ typedef struct { uint8_t priority_listener_count; uint8_t frame_error_listener_count; uint32_t max_invalid_frames = 1000; + uint32_t max_rejected_streams = 100; } SessionJSFields; // Indices for js_fields_, which serves as a way to communicate data with JS @@ -691,6 +692,7 @@ enum SessionUint8Fields { kSessionFrameErrorListenerCount = offsetof(SessionJSFields, frame_error_listener_count), kSessionMaxInvalidFrames = offsetof(SessionJSFields, max_invalid_frames), + kSessionMaxRejectedStreams = offsetof(SessionJSFields, max_rejected_streams), kSessionUint8FieldCount = sizeof(SessionJSFields) }; @@ -1024,7 +1026,7 @@ class Http2Session : public AsyncWrap, public StreamListener { // limit will result in the session being destroyed, as an indication of a // misbehaving peer. This counter is reset once new streams are being // accepted again. - int32_t rejected_stream_count_ = 0; + uint32_t rejected_stream_count_ = 0; // Also use the invalid frame count as a measure for rejecting input frames. uint32_t invalid_frame_count_ = 0; -- cgit v1.2.3