From 18cb4372d1fccb58580f82a58649454032774832 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 2 Sep 2019 01:32:15 +0200 Subject: http2: do not start reading after write if new write is on wire MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Don’t start reading more input data if we’re still busy writing output. This was overlooked in 8a4a1931b8b98. Fixes: https://github.com/nodejs/node/issues/29353 Fixes: https://github.com/nodejs/node/issues/29393 PR-URL: https://github.com/nodejs/node/pull/29399 Reviewed-By: David Carlier Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Matteo Collina --- src/node_http2.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/node_http2.cc') diff --git a/src/node_http2.cc b/src/node_http2.cc index 1065a940f5..a5b834dc2c 100644 --- a/src/node_http2.cc +++ b/src/node_http2.cc @@ -742,8 +742,10 @@ void Http2Session::Close(uint32_t code, bool socket_closed) { flags_ |= SESSION_STATE_CLOSING; // Stop reading on the i/o stream - if (stream_ != nullptr) + if (stream_ != nullptr) { + flags_ |= SESSION_STATE_READING_STOPPED; stream_->ReadStop(); + } // If the socket is not closed, then attempt to send a closing GOAWAY // frame. There is no guarantee that this GOAWAY will be received by @@ -1192,6 +1194,7 @@ int Http2Session::OnDataChunkReceived(nghttp2_session* handle, // If we are currently waiting for a write operation to finish, we should // tell nghttp2 that we want to wait before we process more input data. if (session->flags_ & SESSION_STATE_WRITE_IN_PROGRESS) { + CHECK_NE(session->flags_ & SESSION_STATE_READING_STOPPED, 0); session->flags_ |= SESSION_STATE_NGHTTP2_RECV_PAUSED; return NGHTTP2_ERR_PAUSE; } @@ -1546,6 +1549,7 @@ void Http2Session::OnStreamAfterWrite(WriteWrap* w, int status) { ClearOutgoing(status); if ((flags_ & SESSION_STATE_READING_STOPPED) && + !(flags_ & SESSION_STATE_WRITE_IN_PROGRESS) && nghttp2_session_want_read(session_)) { flags_ &= ~SESSION_STATE_READING_STOPPED; stream_->ReadStart(); -- cgit v1.2.3