]> git.kaiwu.me - nginx.git/commitdiff
HTTP/2: socket leak with "return 444" in error_page (ticket #2455).
authorMaxim Dounin <mdounin@mdounin.ru>
Fri, 10 Mar 2023 03:47:48 +0000 (06:47 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Fri, 10 Mar 2023 03:47:48 +0000 (06:47 +0300)
Similarly to ticket #274 (7354:1812f1d79d84), early request finalization
without calling ngx_http_run_posted_requests() resulted in a connection
hang (a socket leak) if the 400 (Bad Request) error was generated in
ngx_http_v2_state_process_header() due to invalid request headers and
"return 444" was used in error_page 400.

src/http/v2/ngx_http_v2.c

index 0e45a7b27b6a22c2eec1a033da136345ff4a8bc1..d32c03f10b8afb6bec8282da529dfbd9a6aba885 100644 (file)
@@ -1730,6 +1730,7 @@ ngx_http_v2_state_process_header(ngx_http_v2_connection_t *h2c, u_char *pos,
     size_t                      len;
     ngx_int_t                   rc;
     ngx_table_elt_t            *h;
+    ngx_connection_t           *fc;
     ngx_http_header_t          *hh;
     ngx_http_request_t         *r;
     ngx_http_v2_header_t       *header;
@@ -1789,6 +1790,7 @@ ngx_http_v2_state_process_header(ngx_http_v2_connection_t *h2c, u_char *pos,
     }
 
     r = h2c->state.stream->request;
+    fc = r->connection;
 
     /* TODO Optimization: validate headers while parsing. */
     if (ngx_http_v2_validate_header(r, header) != NGX_OK) {
@@ -1886,6 +1888,8 @@ error:
 
     h2c->state.stream = NULL;
 
+    ngx_http_run_posted_requests(fc);
+
     return ngx_http_v2_state_header_complete(h2c, pos, end);
 }