aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2016-07-19 20:34:17 +0300
committerValentin Bartenev <vbart@nginx.com>2016-07-19 20:34:17 +0300
commita85edfeef6cdf4094e6e12b663b7371271cb610f (patch)
tree8be065c021cccb8f79b9b9244ed78ad0df5288ec
parent3c81c08ceae2c22cf5d2ba1b637d685e397a68f2 (diff)
downloadnginx-a85edfeef6cdf4094e6e12b663b7371271cb610f.tar.gz
nginx-a85edfeef6cdf4094e6e12b663b7371271cb610f.zip
HTTP/2: flushing of the SSL buffer in transition to the idle state.
It fixes potential connection leak if some unsent data was left in the SSL buffer. Particularly, that could happen when a client canceled the stream after the HEADERS frame has already been created. In this case no other frames might be produced and the HEADERS frame alone didn't flush the buffer.
-rw-r--r--src/http/v2/ngx_http_v2.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
index 292f430a7..d0cd2ab79 100644
--- a/src/http/v2/ngx_http_v2.c
+++ b/src/http/v2/ngx_http_v2.c
@@ -599,7 +599,8 @@ error:
static void
ngx_http_v2_handle_connection(ngx_http_v2_connection_t *h2c)
{
- ngx_connection_t *c;
+ ngx_int_t rc;
+ ngx_connection_t *c;
ngx_http_v2_srv_conf_t *h2scf;
if (h2c->last_out || h2c->processing) {
@@ -614,7 +615,22 @@ ngx_http_v2_handle_connection(ngx_http_v2_connection_t *h2c)
}
if (c->buffered) {
- return;
+ h2c->blocked = 1;
+
+ rc = ngx_http_v2_send_output_queue(h2c);
+
+ h2c->blocked = 0;
+
+ if (rc == NGX_ERROR) {
+ ngx_http_close_connection(c);
+ return;
+ }
+
+ if (rc == NGX_AGAIN) {
+ return;
+ }
+
+ /* rc == NGX_OK */
}
h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,