Early termination if stream is not found
Add this check in nghttp2_submit_{priority, window_update, data, push_promise}.
This commit is contained in:
parent
80bacd0a54
commit
6ed8a8957b
|
@ -1582,6 +1582,8 @@ int nghttp2_submit_headers(nghttp2_session *session, uint8_t flags,
|
||||||
*
|
*
|
||||||
* :enum:`NGHTTP2_ERR_NOMEM`
|
* :enum:`NGHTTP2_ERR_NOMEM`
|
||||||
* Out of memory.
|
* Out of memory.
|
||||||
|
* :enum:`NGHTTP2_ERR_STREAM_CLOSED`
|
||||||
|
* The stream is already closed or does not exist.
|
||||||
*/
|
*/
|
||||||
int nghttp2_submit_data(nghttp2_session *session, uint8_t flags,
|
int nghttp2_submit_data(nghttp2_session *session, uint8_t flags,
|
||||||
int32_t stream_id,
|
int32_t stream_id,
|
||||||
|
@ -1600,6 +1602,8 @@ int nghttp2_submit_data(nghttp2_session *session, uint8_t flags,
|
||||||
* Out of memory.
|
* Out of memory.
|
||||||
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
|
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
|
||||||
* The |pri| is negative.
|
* The |pri| is negative.
|
||||||
|
* :enum:`NGHTTP2_ERR_STREAM_CLOSED`
|
||||||
|
* The stream is already closed or does not exist.
|
||||||
*/
|
*/
|
||||||
int nghttp2_submit_priority(nghttp2_session *session, int32_t stream_id,
|
int nghttp2_submit_priority(nghttp2_session *session, int32_t stream_id,
|
||||||
int32_t pri);
|
int32_t pri);
|
||||||
|
@ -1678,6 +1682,8 @@ int nghttp2_submit_settings(nghttp2_session *session,
|
||||||
*
|
*
|
||||||
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
|
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
|
||||||
* The |nv| includes empty name or ``NULL`` value.
|
* The |nv| includes empty name or ``NULL`` value.
|
||||||
|
* :enum:`NGHTTP2_ERR_STREAM_CLOSED`
|
||||||
|
* The stream is already closed or does not exist.
|
||||||
* :enum:`NGHTTP2_ERR_NOMEM`
|
* :enum:`NGHTTP2_ERR_NOMEM`
|
||||||
* Out of memory.
|
* Out of memory.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -118,9 +118,14 @@ int nghttp2_submit_priority(nghttp2_session *session, int32_t stream_id,
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
nghttp2_frame *frame;
|
nghttp2_frame *frame;
|
||||||
|
nghttp2_stream *stream;
|
||||||
if(pri < 0) {
|
if(pri < 0) {
|
||||||
return NGHTTP2_ERR_INVALID_ARGUMENT;
|
return NGHTTP2_ERR_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
|
stream = nghttp2_session_get_stream(session, stream_id);
|
||||||
|
if(stream == NULL) {
|
||||||
|
return NGHTTP2_ERR_STREAM_CLOSED;
|
||||||
|
}
|
||||||
frame = malloc(sizeof(nghttp2_frame));
|
frame = malloc(sizeof(nghttp2_frame));
|
||||||
if(frame == NULL) {
|
if(frame == NULL) {
|
||||||
return NGHTTP2_ERR_NOMEM;
|
return NGHTTP2_ERR_NOMEM;
|
||||||
|
@ -134,10 +139,7 @@ int nghttp2_submit_priority(nghttp2_session *session, int32_t stream_id,
|
||||||
}
|
}
|
||||||
/* Only update priority if the sender is client for now */
|
/* Only update priority if the sender is client for now */
|
||||||
if(!session->server) {
|
if(!session->server) {
|
||||||
nghttp2_stream *stream = nghttp2_session_get_stream(session, stream_id);
|
nghttp2_session_reprioritize_stream(session, stream, pri);
|
||||||
if(stream) {
|
|
||||||
nghttp2_session_reprioritize_stream(session, stream, pri);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -202,6 +204,9 @@ int nghttp2_submit_push_promise(nghttp2_session *session, uint8_t flags,
|
||||||
uint8_t flags_copy;
|
uint8_t flags_copy;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
if(nghttp2_session_get_stream(session, stream_id) == NULL) {
|
||||||
|
return NGHTTP2_ERR_STREAM_CLOSED;
|
||||||
|
}
|
||||||
if(!nghttp2_frame_nv_check_null(nv)) {
|
if(!nghttp2_frame_nv_check_null(nv)) {
|
||||||
return NGHTTP2_ERR_INVALID_ARGUMENT;
|
return NGHTTP2_ERR_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
|
@ -240,6 +245,8 @@ int nghttp2_submit_window_update(nghttp2_session *session, uint8_t flags,
|
||||||
stream = nghttp2_session_get_stream(session, stream_id);
|
stream = nghttp2_session_get_stream(session, stream_id);
|
||||||
if(stream) {
|
if(stream) {
|
||||||
stream->local_flow_control = 0;
|
stream->local_flow_control = 0;
|
||||||
|
} else {
|
||||||
|
return NGHTTP2_ERR_STREAM_CLOSED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nghttp2_session_add_window_update(session, flags, stream_id, 0);
|
return nghttp2_session_add_window_update(session, flags, stream_id, 0);
|
||||||
|
@ -331,6 +338,10 @@ int nghttp2_submit_data(nghttp2_session *session, uint8_t flags,
|
||||||
int r;
|
int r;
|
||||||
nghttp2_data *data_frame;
|
nghttp2_data *data_frame;
|
||||||
uint8_t nflags = 0;
|
uint8_t nflags = 0;
|
||||||
|
|
||||||
|
if(nghttp2_session_get_stream(session, stream_id) == NULL) {
|
||||||
|
return NGHTTP2_ERR_STREAM_CLOSED;
|
||||||
|
}
|
||||||
data_frame = malloc(sizeof(nghttp2_frame));
|
data_frame = malloc(sizeof(nghttp2_frame));
|
||||||
if(data_frame == NULL) {
|
if(data_frame == NULL) {
|
||||||
return NGHTTP2_ERR_NOMEM;
|
return NGHTTP2_ERR_NOMEM;
|
||||||
|
|
|
@ -3073,14 +3073,9 @@ void test_nghttp2_session_on_ctrl_not_send(void)
|
||||||
CU_ASSERT(NGHTTP2_HEADERS == user_data.not_sent_frame_type);
|
CU_ASSERT(NGHTTP2_HEADERS == user_data.not_sent_frame_type);
|
||||||
CU_ASSERT(NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE == user_data.not_sent_error);
|
CU_ASSERT(NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE == user_data.not_sent_error);
|
||||||
|
|
||||||
session->next_stream_id = 1;
|
|
||||||
user_data.frame_not_send_cb_called = 0;
|
|
||||||
/* Send PRIORITY to stream ID = 1 which does not exist */
|
/* Send PRIORITY to stream ID = 1 which does not exist */
|
||||||
CU_ASSERT(0 == nghttp2_submit_priority(session, 1, 0));
|
CU_ASSERT(NGHTTP2_ERR_STREAM_CLOSED ==
|
||||||
CU_ASSERT(0 == nghttp2_session_send(session));
|
nghttp2_submit_priority(session, 1, 0));
|
||||||
CU_ASSERT(1 == user_data.frame_not_send_cb_called);
|
|
||||||
CU_ASSERT(NGHTTP2_PRIORITY == user_data.not_sent_frame_type);
|
|
||||||
CU_ASSERT(NGHTTP2_ERR_STREAM_CLOSED == user_data.not_sent_error);
|
|
||||||
|
|
||||||
user_data.frame_not_send_cb_called = 0;
|
user_data.frame_not_send_cb_called = 0;
|
||||||
/* Send GOAWAY */
|
/* Send GOAWAY */
|
||||||
|
|
Loading…
Reference in New Issue