]> git.kaiwu.me - nginx.git/commitdiff
HTTP/2: flushing of the SSL buffer in transition to the idle state.
authorValentin Bartenev <vbart@nginx.com>
Tue, 19 Jul 2016 17:34:17 +0000 (20:34 +0300)
committerValentin Bartenev <vbart@nginx.com>
Tue, 19 Jul 2016 17:34:17 +0000 (20:34 +0300)
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.

src/http/v2/ngx_http_v2.c

index 292f430a7a7337451ff5e936bef68c1704b836f3..d0cd2ab791fb43b5c3acf970436f647a2a21c3ec 100644 (file)
@@ -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,