comparison src/http/v2/ngx_http_v2.c @ 8147:72627f1cf09e

HTTP/2: socket leak with "return 444" in error_page (ticket #2455). 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.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 10 Mar 2023 06:47:48 +0300
parents 336084ff943b
children 9db24374123b
comparison
equal deleted inserted replaced
8146:b7d4bfd132d2 8147:72627f1cf09e
1728 u_char *end) 1728 u_char *end)
1729 { 1729 {
1730 size_t len; 1730 size_t len;
1731 ngx_int_t rc; 1731 ngx_int_t rc;
1732 ngx_table_elt_t *h; 1732 ngx_table_elt_t *h;
1733 ngx_connection_t *fc;
1733 ngx_http_header_t *hh; 1734 ngx_http_header_t *hh;
1734 ngx_http_request_t *r; 1735 ngx_http_request_t *r;
1735 ngx_http_v2_header_t *header; 1736 ngx_http_v2_header_t *header;
1736 ngx_http_core_srv_conf_t *cscf; 1737 ngx_http_core_srv_conf_t *cscf;
1737 ngx_http_core_main_conf_t *cmcf; 1738 ngx_http_core_main_conf_t *cmcf;
1787 if (h2c->state.stream == NULL) { 1788 if (h2c->state.stream == NULL) {
1788 return ngx_http_v2_state_header_complete(h2c, pos, end); 1789 return ngx_http_v2_state_header_complete(h2c, pos, end);
1789 } 1790 }
1790 1791
1791 r = h2c->state.stream->request; 1792 r = h2c->state.stream->request;
1793 fc = r->connection;
1792 1794
1793 /* TODO Optimization: validate headers while parsing. */ 1795 /* TODO Optimization: validate headers while parsing. */
1794 if (ngx_http_v2_validate_header(r, header) != NGX_OK) { 1796 if (ngx_http_v2_validate_header(r, header) != NGX_OK) {
1795 if (ngx_http_v2_terminate_stream(h2c, h2c->state.stream, 1797 if (ngx_http_v2_terminate_stream(h2c, h2c->state.stream,
1796 NGX_HTTP_V2_PROTOCOL_ERROR) 1798 NGX_HTTP_V2_PROTOCOL_ERROR)
1883 return ngx_http_v2_state_header_complete(h2c, pos, end); 1885 return ngx_http_v2_state_header_complete(h2c, pos, end);
1884 1886
1885 error: 1887 error:
1886 1888
1887 h2c->state.stream = NULL; 1889 h2c->state.stream = NULL;
1890
1891 ngx_http_run_posted_requests(fc);
1888 1892
1889 return ngx_http_v2_state_header_complete(h2c, pos, end); 1893 return ngx_http_v2_state_header_complete(h2c, pos, end);
1890 } 1894 }
1891 1895
1892 1896