Fix reception of ENABLE_PUSH ignored; strict check for SETTINGS value
This commit is contained in:
parent
112b49cb9a
commit
f2c654f898
|
@ -622,13 +622,19 @@ int nghttp2_iv_check(const nghttp2_settings_entry *iv, size_t niv)
|
||||||
size_t i;
|
size_t i;
|
||||||
for(i = 0; i < niv; ++i) {
|
for(i = 0; i < niv; ++i) {
|
||||||
switch(iv[i].settings_id) {
|
switch(iv[i].settings_id) {
|
||||||
|
case NGHTTP2_SETTINGS_HEADER_TABLE_SIZE:
|
||||||
|
case NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS:
|
||||||
|
break;
|
||||||
|
case NGHTTP2_SETTINGS_ENABLE_PUSH:
|
||||||
|
if(iv[i].value != 0 && iv[i].value != 1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE:
|
case NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE:
|
||||||
if(iv[i].value > (uint32_t)NGHTTP2_MAX_WINDOW_SIZE) {
|
if(iv[i].value > (uint32_t)NGHTTP2_MAX_WINDOW_SIZE) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -2720,23 +2720,27 @@ int nghttp2_session_on_settings_received(nghttp2_session *session,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case NGHTTP2_SETTINGS_ENABLE_PUSH:
|
||||||
|
if(entry->value != 0 && entry->value != 1) {
|
||||||
|
return nghttp2_session_handle_invalid_connection
|
||||||
|
(session, frame, NGHTTP2_PROTOCOL_ERROR);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE:
|
case NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE:
|
||||||
/* Update the initial window size of the all active streams */
|
/* Update the initial window size of the all active streams */
|
||||||
/* Check that initial_window_size < (1u << 31) */
|
/* Check that initial_window_size < (1u << 31) */
|
||||||
if(entry->value <= NGHTTP2_MAX_WINDOW_SIZE) {
|
if(entry->value > NGHTTP2_MAX_WINDOW_SIZE) {
|
||||||
rv = nghttp2_session_update_remote_initial_window_size
|
|
||||||
(session, entry->value);
|
|
||||||
if(rv != 0) {
|
|
||||||
if(nghttp2_is_fatal(rv)) {
|
|
||||||
return rv;
|
|
||||||
} else {
|
|
||||||
return nghttp2_session_handle_invalid_connection
|
|
||||||
(session, frame, NGHTTP2_FLOW_CONTROL_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return nghttp2_session_handle_invalid_connection
|
return nghttp2_session_handle_invalid_connection
|
||||||
(session, frame, NGHTTP2_PROTOCOL_ERROR);
|
(session, frame, NGHTTP2_FLOW_CONTROL_ERROR);
|
||||||
|
}
|
||||||
|
rv = nghttp2_session_update_remote_initial_window_size
|
||||||
|
(session, entry->value);
|
||||||
|
if(nghttp2_is_fatal(rv)) {
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
if(rv != 0) {
|
||||||
|
return nghttp2_session_handle_invalid_connection
|
||||||
|
(session, frame, NGHTTP2_FLOW_CONTROL_ERROR);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -409,4 +409,13 @@ void test_nghttp2_iv_check(void)
|
||||||
/* Too large window size */
|
/* Too large window size */
|
||||||
iv[1].value = (uint32_t)NGHTTP2_MAX_WINDOW_SIZE + 1;
|
iv[1].value = (uint32_t)NGHTTP2_MAX_WINDOW_SIZE + 1;
|
||||||
CU_ASSERT(0 == nghttp2_iv_check(iv, 2));
|
CU_ASSERT(0 == nghttp2_iv_check(iv, 2));
|
||||||
|
|
||||||
|
/* ENABLE_PUSH only allows 0 or 1 */
|
||||||
|
iv[1].settings_id = NGHTTP2_SETTINGS_ENABLE_PUSH;
|
||||||
|
iv[1].value = 0;
|
||||||
|
CU_ASSERT(nghttp2_iv_check(iv, 2));
|
||||||
|
iv[1].value = 1;
|
||||||
|
CU_ASSERT(nghttp2_iv_check(iv, 2));
|
||||||
|
iv[1].value = 3;
|
||||||
|
CU_ASSERT(!nghttp2_iv_check(iv, 2));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1314,8 +1314,7 @@ void test_nghttp2_session_on_settings_received(void)
|
||||||
iv[3].settings_id = NGHTTP2_SETTINGS_HEADER_TABLE_SIZE;
|
iv[3].settings_id = NGHTTP2_SETTINGS_HEADER_TABLE_SIZE;
|
||||||
iv[3].value = 1024;
|
iv[3].value = 1024;
|
||||||
|
|
||||||
/* Unknown settings ID */
|
iv[4].settings_id = NGHTTP2_SETTINGS_ENABLE_PUSH;
|
||||||
iv[4].settings_id = 999;
|
|
||||||
iv[4].value = 0;
|
iv[4].value = 0;
|
||||||
|
|
||||||
memset(&callbacks, 0, sizeof(nghttp2_session_callbacks));
|
memset(&callbacks, 0, sizeof(nghttp2_session_callbacks));
|
||||||
|
@ -1343,6 +1342,8 @@ void test_nghttp2_session_on_settings_received(void)
|
||||||
session->remote_settings[NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE]);
|
session->remote_settings[NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE]);
|
||||||
CU_ASSERT(1024 ==
|
CU_ASSERT(1024 ==
|
||||||
session->remote_settings[NGHTTP2_SETTINGS_HEADER_TABLE_SIZE]);
|
session->remote_settings[NGHTTP2_SETTINGS_HEADER_TABLE_SIZE]);
|
||||||
|
CU_ASSERT(0 ==
|
||||||
|
session->remote_settings[NGHTTP2_SETTINGS_ENABLE_PUSH]);
|
||||||
|
|
||||||
CU_ASSERT(64*1024 == stream1->remote_window_size);
|
CU_ASSERT(64*1024 == stream1->remote_window_size);
|
||||||
CU_ASSERT(0 == stream2->remote_window_size);
|
CU_ASSERT(0 == stream2->remote_window_size);
|
||||||
|
|
Loading…
Reference in New Issue