]> git.kaiwu.me - nginx.git/commitdiff
HTTP/2: fixed reusing connections with active requests.
authorMaxim Dounin <mdounin@mdounin.ru>
Thu, 11 Feb 2021 18:52:17 +0000 (21:52 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Thu, 11 Feb 2021 18:52:17 +0000 (21:52 +0300)
New connections are marked reusable by ngx_http_init_connection() if there
are no data available for reading.  As a result, if SSL is not used,
ngx_http_v2_init() might be called when the connection is marked reusable.
If a HEADERS frame is immediately available for reading, this resulted
in connection being preserved in reusable state with an active request,
and possibly closed later as if during worker shutdown (that is, after
all active requests were finalized).

Fix is to explicitly mark connections non-reusable in ngx_http_v2_init()
instead of (incorrectly) assuming they are already non-reusable.

Found by Sergey Kandaurov.

src/http/v2/ngx_http_v2.c

index df78576df297ea0cca68a2dbd7a911ae3ea98177..5482ea63eb5c7f3b74d2066254f78d88a469bfb4 100644 (file)
@@ -326,6 +326,7 @@ ngx_http_v2_init(ngx_event_t *rev)
     c->write->handler = ngx_http_v2_write_handler;
 
     c->idle = 1;
+    ngx_reusable_connection(c, 0);
 
     ngx_http_v2_read_handler(rev);
 }