Check stream_id is nonzero for DATA, HEADERS, PRIORITY, RST_STREAM, PUSH_PROMISE

This commit is contained in:
Tatsuhiro Tsujikawa 2014-06-07 18:48:37 +09:00
parent bfaab30733
commit 19729962a3
2 changed files with 30 additions and 2 deletions

View File

@ -2231,6 +2231,8 @@ int32_t nghttp2_submit_request(nghttp2_session *session,
* *
* :enum:`NGHTTP2_ERR_NOMEM` * :enum:`NGHTTP2_ERR_NOMEM`
* Out of memory. * Out of memory.
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
* The |stream_id| is 0.
*/ */
int nghttp2_submit_response(nghttp2_session *session, int nghttp2_submit_response(nghttp2_session *session,
int32_t stream_id, int32_t stream_id,
@ -2297,6 +2299,8 @@ int nghttp2_submit_response(nghttp2_session *session,
* :enum:`NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE` * :enum:`NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE`
* No stream ID is available because maximum stream ID was * No stream ID is available because maximum stream ID was
* reached. * reached.
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
* The |stream_id| is 0.
* *
* .. warning:: * .. warning::
* *
@ -2332,6 +2336,8 @@ int32_t nghttp2_submit_headers(nghttp2_session *session, uint8_t flags,
* Out of memory. * Out of memory.
* :enum:`NGHTTP2_ERR_DATA_EXIST` * :enum:`NGHTTP2_ERR_DATA_EXIST`
* DATA has been already submitted and not fully processed yet. * DATA has been already submitted and not fully processed yet.
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
* The |stream_id| is 0.
*/ */
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,
@ -2363,7 +2369,8 @@ int nghttp2_submit_data(nghttp2_session *session, uint8_t flags,
* :enum:`NGHTTP2_ERR_NOMEM` * :enum:`NGHTTP2_ERR_NOMEM`
* Out of memory. * Out of memory.
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT` * :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
* The |pri_spec| is NULL; or trying to depend on itself. * The |stream_id| is 0; or the |pri_spec| is NULL; or trying to
* depend on itself.
*/ */
int nghttp2_submit_priority(nghttp2_session *session, uint8_t flags, int nghttp2_submit_priority(nghttp2_session *session, uint8_t flags,
int32_t stream_id, int32_t stream_id,
@ -2383,6 +2390,8 @@ int nghttp2_submit_priority(nghttp2_session *session, uint8_t flags,
* *
* :enum:`NGHTTP2_ERR_NOMEM` * :enum:`NGHTTP2_ERR_NOMEM`
* Out of memory. * Out of memory.
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
* The |stream_id| is 0.
*/ */
int nghttp2_submit_rst_stream(nghttp2_session *session, uint8_t flags, int nghttp2_submit_rst_stream(nghttp2_session *session, uint8_t flags,
int32_t stream_id, int32_t stream_id,
@ -2466,6 +2475,8 @@ int nghttp2_submit_settings(nghttp2_session *session, uint8_t flags,
* :enum:`NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE` * :enum:`NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE`
* No stream ID is available because maximum stream ID was * No stream ID is available because maximum stream ID was
* reached. * reached.
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
* The |stream_id| is 0.
* *
* .. warning:: * .. warning::
* *

View File

@ -52,6 +52,11 @@ static int32_t submit_headers_shared
nghttp2_headers_aux_data *aux_data = NULL; nghttp2_headers_aux_data *aux_data = NULL;
nghttp2_headers_category hcat; nghttp2_headers_category hcat;
if(stream_id == 0) {
rv = NGHTTP2_ERR_INVALID_ARGUMENT;
goto fail;
}
if(data_prd != NULL && data_prd->read_callback != NULL) { if(data_prd != NULL && data_prd->read_callback != NULL) {
data_prd_copy = malloc(sizeof(nghttp2_data_provider)); data_prd_copy = malloc(sizeof(nghttp2_data_provider));
if(data_prd_copy == NULL) { if(data_prd_copy == NULL) {
@ -197,7 +202,7 @@ int nghttp2_submit_priority(nghttp2_session *session, uint8_t flags,
nghttp2_frame *frame; nghttp2_frame *frame;
nghttp2_priority_spec copy_pri_spec; nghttp2_priority_spec copy_pri_spec;
if(pri_spec == NULL) { if(stream_id == 0 || pri_spec == NULL) {
return NGHTTP2_ERR_INVALID_ARGUMENT; return NGHTTP2_ERR_INVALID_ARGUMENT;
} }
@ -233,6 +238,10 @@ int nghttp2_submit_rst_stream(nghttp2_session *session, uint8_t flags,
int32_t stream_id, int32_t stream_id,
nghttp2_error_code error_code) nghttp2_error_code error_code)
{ {
if(stream_id == 0) {
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
return nghttp2_session_add_rst_stream(session, stream_id, error_code); return nghttp2_session_add_rst_stream(session, stream_id, error_code);
} }
@ -262,6 +271,10 @@ int32_t nghttp2_submit_push_promise(nghttp2_session *session, uint8_t flags,
int32_t promised_stream_id; int32_t promised_stream_id;
int rv; int rv;
if(stream_id == 0) {
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
if(!session->server) { if(!session->server) {
return NGHTTP2_ERR_PROTO; return NGHTTP2_ERR_PROTO;
} }
@ -495,6 +508,10 @@ int nghttp2_submit_data(nghttp2_session *session, uint8_t flags,
uint8_t nflags = flags & (NGHTTP2_FLAG_END_STREAM | uint8_t nflags = flags & (NGHTTP2_FLAG_END_STREAM |
NGHTTP2_FLAG_END_SEGMENT); NGHTTP2_FLAG_END_SEGMENT);
if(stream_id == 0) {
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
data_frame = malloc(sizeof(nghttp2_private_data)); data_frame = malloc(sizeof(nghttp2_private_data));
if(data_frame == NULL) { if(data_frame == NULL) {
return NGHTTP2_ERR_NOMEM; return NGHTTP2_ERR_NOMEM;