diff --git a/talk/app/webrtc/datachannel.cc b/talk/app/webrtc/datachannel.cc index 048e89a505..db3e1575e0 100644 --- a/talk/app/webrtc/datachannel.cc +++ b/talk/app/webrtc/datachannel.cc @@ -284,6 +284,10 @@ void DataChannel::OnDataEngineClose() { void DataChannel::OnDataReceived(cricket::DataChannel* channel, const cricket::ReceiveDataParams& params, const talk_base::Buffer& payload) { + if (state_ != kOpen) { + return; + } + uint32 expected_ssrc = (data_channel_type_ == cricket::DCT_RTP) ? receive_ssrc_ : config_.id; if (params.ssrc != expected_ssrc) { diff --git a/talk/app/webrtc/datachannel_unittest.cc b/talk/app/webrtc/datachannel_unittest.cc index 1be24e96ce..4406b9a241 100644 --- a/talk/app/webrtc/datachannel_unittest.cc +++ b/talk/app/webrtc/datachannel_unittest.cc @@ -302,3 +302,16 @@ TEST_F(SctpDataChannelTest, OpenAckRoleInitialization) { webrtc::InternalDataChannelInit init2(base); EXPECT_EQ(webrtc::InternalDataChannelInit::kNone, init2.open_handshake_role); } + +// Tests that message is dropped if the channel is not open. +TEST_F(SctpDataChannelTest, ReceivedDataDroppedIfNotOpen) { + AddObserver(); + EXPECT_CALL(*(observer_.get()), OnMessage(testing::_)).Times(0); + + webrtc_data_channel_->SetSctpSid(1); + + cricket::ReceiveDataParams params; + params.ssrc = 1; + webrtc::DataBuffer buffer("abcd"); + webrtc_data_channel_->OnDataReceived(NULL, params, buffer.data); +}