inflate_header_block: Issue RST_STREAM if header decompression failed
This commit is contained in:
parent
0fa4779d38
commit
1be8d1b797
|
@ -2151,6 +2151,8 @@ static ssize_t inflate_header_block(nghttp2_session *session,
|
||||||
ssize_t rv;
|
ssize_t rv;
|
||||||
int inflate_flags;
|
int inflate_flags;
|
||||||
nghttp2_nv nv;
|
nghttp2_nv nv;
|
||||||
|
nghttp2_stream *stream;
|
||||||
|
|
||||||
*readlen_ptr = 0;
|
*readlen_ptr = 0;
|
||||||
|
|
||||||
DEBUGF(fprintf(stderr, "processing header block %zu bytes\n", inlen));
|
DEBUGF(fprintf(stderr, "processing header block %zu bytes\n", inlen));
|
||||||
|
@ -2163,15 +2165,26 @@ static ssize_t inflate_header_block(nghttp2_session *session,
|
||||||
}
|
}
|
||||||
if(rv < 0) {
|
if(rv < 0) {
|
||||||
if(session->iframe.state == NGHTTP2_IB_READ_HEADER_BLOCK) {
|
if(session->iframe.state == NGHTTP2_IB_READ_HEADER_BLOCK) {
|
||||||
rv = nghttp2_session_handle_invalid_connection
|
stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
|
||||||
(session, frame, NGHTTP2_COMPRESSION_ERROR);
|
|
||||||
} else {
|
if(stream && stream->state != NGHTTP2_STREAM_CLOSING) {
|
||||||
rv = nghttp2_session_terminate_session(session,
|
/* Adding RST_STREAM here is very important. It prevents
|
||||||
NGHTTP2_COMPRESSION_ERROR);
|
from invoking subsequent callbacks for the same stream
|
||||||
|
ID. */
|
||||||
|
rv = nghttp2_session_add_rst_stream(session, frame->hd.stream_id,
|
||||||
|
NGHTTP2_COMPRESSION_ERROR);
|
||||||
|
|
||||||
|
if(nghttp2_is_fatal(rv)) {
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(rv != 0) {
|
rv = nghttp2_session_terminate_session(session,
|
||||||
|
NGHTTP2_COMPRESSION_ERROR);
|
||||||
|
if(nghttp2_is_fatal(rv)) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NGHTTP2_ERR_HEADER_COMP;
|
return NGHTTP2_ERR_HEADER_COMP;
|
||||||
}
|
}
|
||||||
in += rv;
|
in += rv;
|
||||||
|
|
|
@ -879,8 +879,8 @@ void test_nghttp2_session_recv_premature_headers(void)
|
||||||
|
|
||||||
item = nghttp2_session_get_next_ob_item(session);
|
item = nghttp2_session_get_next_ob_item(session);
|
||||||
CU_ASSERT(NULL != item);
|
CU_ASSERT(NULL != item);
|
||||||
CU_ASSERT(NGHTTP2_GOAWAY == OB_CTRL_TYPE(item));
|
CU_ASSERT(NGHTTP2_RST_STREAM == OB_CTRL_TYPE(item));
|
||||||
CU_ASSERT(NGHTTP2_COMPRESSION_ERROR == OB_CTRL(item)->goaway.error_code);
|
CU_ASSERT(NGHTTP2_COMPRESSION_ERROR == OB_CTRL(item)->rst_stream.error_code);
|
||||||
|
|
||||||
nghttp2_bufs_free(&bufs);
|
nghttp2_bufs_free(&bufs);
|
||||||
nghttp2_hd_deflate_free(&deflater);
|
nghttp2_hd_deflate_free(&deflater);
|
||||||
|
|
Loading…
Reference in New Issue