Commit a3654fbb authored by Ryan Hamilton's avatar Ryan Hamilton Committed by Commit Bot

Close QUIC connections when a STREAM or RST_STREAM frame are received for stream 0.

BUG=783897

Cq-Include-Trybots: master.tryserver.chromium.android:android_cronet_tester;master.tryserver.chromium.mac:ios-simulator-cronet
Change-Id: Id5ef2b72cd73f2fbdbb49ab2f3dab590a9e3b3d2
Reviewed-on: https://chromium-review.googlesource.com/767153
Commit-Queue: Ryan Hamilton <rch@chromium.org>
Reviewed-by: default avatarBuck Krasic <ckrasic@chromium.org>
Cr-Commit-Position: refs/heads/master@{#517480}
parent cfef5d51
...@@ -83,6 +83,13 @@ QuicSession::~QuicSession() { ...@@ -83,6 +83,13 @@ QuicSession::~QuicSession() {
void QuicSession::OnStreamFrame(const QuicStreamFrame& frame) { void QuicSession::OnStreamFrame(const QuicStreamFrame& frame) {
// TODO(rch) deal with the error case of stream id 0. // TODO(rch) deal with the error case of stream id 0.
QuicStreamId stream_id = frame.stream_id; QuicStreamId stream_id = frame.stream_id;
if (stream_id == kInvalidStreamId) {
connection()->CloseConnection(
QUIC_INVALID_STREAM_ID, "Recevied data for an invalid stream",
ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
return;
}
if (frame.fin && QuicContainsKey(static_stream_map_, stream_id)) { if (frame.fin && QuicContainsKey(static_stream_map_, stream_id)) {
connection()->CloseConnection( connection()->CloseConnection(
QUIC_INVALID_STREAM_ID, "Attempt to close a static stream", QUIC_INVALID_STREAM_ID, "Attempt to close a static stream",
...@@ -105,7 +112,15 @@ void QuicSession::OnStreamFrame(const QuicStreamFrame& frame) { ...@@ -105,7 +112,15 @@ void QuicSession::OnStreamFrame(const QuicStreamFrame& frame) {
} }
void QuicSession::OnRstStream(const QuicRstStreamFrame& frame) { void QuicSession::OnRstStream(const QuicRstStreamFrame& frame) {
if (QuicContainsKey(static_stream_map_, frame.stream_id)) { QuicStreamId stream_id = frame.stream_id;
if (stream_id == kInvalidStreamId) {
connection()->CloseConnection(
QUIC_INVALID_STREAM_ID, "Recevied data for an invalid stream",
ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
return;
}
if (QuicContainsKey(static_stream_map_, stream_id)) {
connection()->CloseConnection( connection()->CloseConnection(
QUIC_INVALID_STREAM_ID, "Attempt to reset a static stream", QUIC_INVALID_STREAM_ID, "Attempt to reset a static stream",
ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
...@@ -116,7 +131,7 @@ void QuicSession::OnRstStream(const QuicRstStreamFrame& frame) { ...@@ -116,7 +131,7 @@ void QuicSession::OnRstStream(const QuicRstStreamFrame& frame) {
visitor_->OnRstStreamReceived(frame); visitor_->OnRstStreamReceived(frame);
} }
QuicStream* stream = GetOrCreateDynamicStream(frame.stream_id); QuicStream* stream = GetOrCreateDynamicStream(stream_id);
if (!stream) { if (!stream) {
HandleRstOnValidNonexistentStream(frame); HandleRstOnValidNonexistentStream(frame);
return; // Errors are handled by GetOrCreateStream. return; // Errors are handled by GetOrCreateStream.
......
...@@ -895,6 +895,26 @@ TEST_P(QuicSessionTestServer, OnRstStreamStaticStreamId) { ...@@ -895,6 +895,26 @@ TEST_P(QuicSessionTestServer, OnRstStreamStaticStreamId) {
session_.OnRstStream(rst1); session_.OnRstStream(rst1);
} }
TEST_P(QuicSessionTestServer, OnStreamFrameInvalidStreamId) {
// Send two bytes of payload.
QuicStreamFrame data1(kInvalidStreamId, true, 0, QuicStringPiece("HT"));
EXPECT_CALL(*connection_,
CloseConnection(
QUIC_INVALID_STREAM_ID, "Recevied data for an invalid stream",
ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET));
session_.OnStreamFrame(data1);
}
TEST_P(QuicSessionTestServer, OnRstStreamInvalidStreamId) {
// Send two bytes of payload.
QuicRstStreamFrame rst1(kInvalidStreamId, QUIC_ERROR_PROCESSING_STREAM, 0);
EXPECT_CALL(*connection_,
CloseConnection(
QUIC_INVALID_STREAM_ID, "Recevied data for an invalid stream",
ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET));
session_.OnRstStream(rst1);
}
TEST_P(QuicSessionTestServer, HandshakeUnblocksFlowControlBlockedStream) { TEST_P(QuicSessionTestServer, HandshakeUnblocksFlowControlBlockedStream) {
// Test that if a stream is flow control blocked, then on receipt of the SHLO // Test that if a stream is flow control blocked, then on receipt of the SHLO
// containing a suitable send window offset, the stream becomes unblocked. // containing a suitable send window offset, the stream becomes unblocked.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment