mirror of
https://github.com/nginx/nginx.git
synced 2024-12-19 05:33:52 -06:00
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@google.com>
This commit is contained in:
parent
f0b0003f38
commit
6cfc65c993
@ -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_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;
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user