Skip to content

Commit a3c33d4

Browse files
kumarakBethGriggs
authored andcommitted
http2: update handling of rst_stream with error code NGHTTP2_CANCEL
The PR updates the handling of rst_stream frames and adds all streams to the pending list on receiving rst frames with the error code NGHTTP2_CANCEL. The changes will remove dependency on the stream state that may allow bypassing the checks in certain cases. I think a better solution is to delay streams in all cases if rst_stream is received for the cancel events. The rst_stream frames can be received for protocol/connection error as well it should be handled immediately. Adding streams to the pending list in such cases may cause errors. CVE-ID: CVE-2021-22930 Refs: https://nvd.nist.gov/vuln/detail/CVE-2021-22930 PR-URL: #39622 Refs: #39423 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Beth Griggs <[email protected]>
1 parent 2a99549 commit a3c33d4

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

Diff for: src/node_http2.cc

+12-12
Original file line numberDiff line numberDiff line change
@@ -2196,21 +2196,21 @@ void Http2Stream::SubmitRstStream(const uint32_t code) {
21962196
CHECK(!this->is_destroyed());
21972197
code_ = code;
21982198

2199-
// If RST_STREAM frame is received and stream is not writable
2200-
// because it is busy reading data, don't try force purging it.
2201-
// Instead add the stream to pending stream list and process
2202-
// the pending data when it is safe to do so. This is to avoid
2203-
// double free error due to unwanted behavior of nghttp2.
2204-
// Ref:https://github.com/nodejs/node/issues/38964
2205-
2206-
// Add stream to the pending list if it is received with scope
2199+
auto is_stream_cancel = [](const uint32_t code) {
2200+
return code == NGHTTP2_CANCEL;
2201+
};
2202+
2203+
// If RST_STREAM frame is received with error code NGHTTP2_CANCEL,
2204+
// add it to the pending list and don't force purge the data. It is
2205+
// to avoids the double free error due to unwanted behavior of nghttp2.
2206+
2207+
// Add stream to the pending list only if it is received with scope
22072208
// below in the stack. The pending list may not get processed
22082209
// if RST_STREAM received is not in scope and added to the list
22092210
// causing endpoint to hang.
2210-
if (session_->is_in_scope() &&
2211-
!is_writable() && is_reading()) {
2212-
session_->AddPendingRstStream(id_);
2213-
return;
2211+
if (session_->is_in_scope() && is_stream_cancel(code)) {
2212+
session_->AddPendingRstStream(id_);
2213+
return;
22142214
}
22152215

22162216

0 commit comments

Comments
 (0)