Don't send GOAWAY with last stream ID larger than the value previously sent

This commit is contained in:
Tatsuhiro Tsujikawa 2014-06-18 11:03:55 +09:00
parent 817e1ce2a7
commit 975524a125
2 changed files with 9 additions and 0 deletions

View File

@ -322,6 +322,7 @@ static int session_new(nghttp2_session **session_ptr,
(*session_ptr)->local_window_size = NGHTTP2_INITIAL_CONNECTION_WINDOW_SIZE;
(*session_ptr)->goaway_flags = NGHTTP2_GOAWAY_NONE;
(*session_ptr)->local_last_stream_id = (1u << 31) - 1;
(*session_ptr)->remote_last_stream_id = 0;
(*session_ptr)->inflight_niv = -1;
@ -1727,11 +1728,17 @@ static int session_prep_frame(nghttp2_session *session,
break;
}
case NGHTTP2_GOAWAY:
if(session->local_last_stream_id < frame->goaway.last_stream_id) {
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
framerv = nghttp2_frame_pack_goaway(&session->aob.framebufs,
&frame->goaway);
if(framerv < 0) {
return framerv;
}
session->local_last_stream_id = frame->goaway.last_stream_id;
break;
case NGHTTP2_EXT_ALTSVC:
rv = session_predicate_altsvc_send(session, frame->hd.stream_id);

View File

@ -189,6 +189,8 @@ struct nghttp2_session {
/* Counter of unique ID of PING. Wraps when it exceeds
NGHTTP2_MAX_UNIQUE_ID */
uint32_t next_unique_id;
/* This is the last-stream-ID we have sent in GOAWAY */
int32_t local_last_stream_id;
/* This is the value in GOAWAY frame received from remote endpoint. */
int32_t remote_last_stream_id;
/* Current sender window size. This value is computed against the