Skip to content

Commit

Permalink
HTTP/2: emit new frames only after applying all SETTINGS params.
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
PiotrSikora committed Jun 2, 2017
1 parent f0b0003 commit 6cfc65c
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions src/http/v2/ngx_http_v2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -1995,12 +1998,7 @@ ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c, u_char *pos,
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;
Expand Down Expand Up @@ -2028,6 +2026,13 @@ ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c, u_char *pos,
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);
}

Expand Down

0 comments on commit 6cfc65c

Please sign in to comment.