[nginx] HTTP/2: emit new frames only after applying all SETTINGS params.

Valentin Bartenev vbart at nginx.com
Fri Jun 2 12:08:26 UTC 2017


details:   http://hg.nginx.org/nginx/rev/645ed7112a01
branches:  
changeset: 7022:645ed7112a01
user:      Piotr Sikora <piotrsikora at google.com>
date:      Fri Jun 02 15:05:20 2017 +0300
description:
HTTP/2: emit new frames only after applying all SETTINGS params.

Previously, new frames could be emitted in the middle of applying
new (and already acknowledged) SETTINGS params, which is illegal.

Signed-off-by: Piotr Sikora <piotrsikora at google.com>

diffstat:

 src/http/v2/ngx_http_v2.c |  17 +++++++++++------
 1 files changed, 11 insertions(+), 6 deletions(-)

diffs (43 lines):

diff -r 639e48c382a6 -r 645ed7112a01 src/http/v2/ngx_http_v2.c
--- a/src/http/v2/ngx_http_v2.c	Fri Jun 02 12:55:31 2017 +0300
+++ b/src/http/v2/ngx_http_v2.c	Fri Jun 02 15:05:20 2017 +0300
@@ -1969,8 +1969,11 @@ static u_char *
 ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c, u_char *pos,
     u_char *end)
 {
+    ssize_t     window_delta;
     ngx_uint_t  id, value;
 
+    window_delta = 0;
+
     while (h2c->state.length) {
         if (end - pos < NGX_HTTP_V2_SETTINGS_PARAM_SIZE) {
             return ngx_http_v2_state_save(h2c, pos, end,
@@ -1995,12 +1998,7 @@ ngx_http_v2_state_settings_params(ngx_ht
                                                   NGX_HTTP_V2_FLOW_CTRL_ERROR);
             }
 
-            if (ngx_http_v2_adjust_windows(h2c, value - h2c->init_window)
-                != NGX_OK)
-            {
-                return ngx_http_v2_connection_error(h2c,
-                                                    NGX_HTTP_V2_INTERNAL_ERROR);
-            }
+            window_delta = value - h2c->init_window;
 
             h2c->init_window = value;
             break;
@@ -2028,6 +2026,13 @@ ngx_http_v2_state_settings_params(ngx_ht
         pos += NGX_HTTP_V2_SETTINGS_PARAM_SIZE;
     }
 
+    if (window_delta) {
+        if (ngx_http_v2_adjust_windows(h2c, window_delta) != NGX_OK) {
+            return ngx_http_v2_connection_error(h2c,
+                                                NGX_HTTP_V2_INTERNAL_ERROR);
+        }
+    }
+
     return ngx_http_v2_state_complete(h2c, pos, end);
 }
 


More information about the nginx-devel mailing list