]> git.kaiwu.me - nginx.git/commitdiff
HTTP/2: fixed socket leak with queued frames (ticket #1689).
authorMaxim Dounin <mdounin@mdounin.ru>
Mon, 23 Dec 2019 18:25:17 +0000 (21:25 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Mon, 23 Dec 2019 18:25:17 +0000 (21:25 +0300)
If a stream is closed with queued frames, it is possible that no further
write events will occur on the stream, leading to the socket leak.
To fix this, the stream's fake connection read handler is set to
ngx_http_v2_close_stream_handler(), to make sure that finalizing the
connection with ngx_http_v2_finalize_connection() will be able to
close the stream regardless of the current number of queued frames.

Additionally, the stream's fake connection fc->error flag is explicitly
set, so ngx_http_v2_handle_stream() will post a write event when queued
frames are finally sent even if stream flow control window is exhausted.

src/http/v2/ngx_http_v2.c

index d0e44475c26f3d721f5afdda97476bc4b6cf3cb4..d28b8090a9323269a74f08e22d2af9a5135667e4 100644 (file)
@@ -4288,8 +4288,9 @@ ngx_http_v2_close_stream(ngx_http_v2_stream_t *stream, ngx_int_t rc)
     fc = stream->request->connection;
 
     if (stream->queued) {
+        fc->error = 1;
         fc->write->handler = ngx_http_v2_close_stream_handler;
-        fc->read->handler = ngx_http_empty_handler;
+        fc->read->handler = ngx_http_v2_close_stream_handler;
         return;
     }