File tree Expand file tree Collapse file tree 1 file changed +19
-0
lines changed Expand file tree Collapse file tree 1 file changed +19
-0
lines changed Original file line number Diff line number Diff line change @@ -2118,6 +2118,25 @@ int Http2Stream::SubmitPriority(const Http2Priority& priority,
2118
2118
void Http2Stream::SubmitRstStream (const uint32_t code) {
2119
2119
CHECK (!this ->is_destroyed ());
2120
2120
code_ = code;
2121
+
2122
+ // If RST_STREAM frame is received and stream is not writable
2123
+ // because it is busy reading data, don't try force purging it.
2124
+ // Instead add the stream to pending stream list and process
2125
+ // the pending data when it is safe to do so. This is to avoid
2126
+ // double free error due to unwanted behavior of nghttp2.
2127
+ // Ref:https://github.com/nodejs/node/issues/38964
2128
+
2129
+ // Add stream to the pending list if it is received with scope
2130
+ // below in the stack. The pending list may not get processed
2131
+ // if RST_STREAM received is not in scope and added to the list
2132
+ // causing endpoint to hang.
2133
+ if (session_->is_in_scope () &&
2134
+ !is_writable () && is_reading ()) {
2135
+ session_->AddPendingRstStream (id_);
2136
+ return ;
2137
+ }
2138
+
2139
+
2121
2140
// If possible, force a purge of any currently pending data here to make sure
2122
2141
// it is sent before closing the stream. If it returns non-zero then we need
2123
2142
// to wait until the current write finishes and try again to avoid nghttp2
You can’t perform that action at this time.
0 commit comments