Mercurial > hg > nginx
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 |