sctp: Properly drop messages with unknown PPID values
Bug: webrtc:14992
Change-Id: I535cd939949ba35072e407d73450093a512aa2ff
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/297403
Auto-Submit: Florent Castelli <orphis@webrtc.org>
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39550}
diff --git a/media/sctp/dcsctp_transport.cc b/media/sctp/dcsctp_transport.cc
index 10eaa00..0181f7a 100644
--- a/media/sctp/dcsctp_transport.cc
+++ b/media/sctp/dcsctp_transport.cc
@@ -461,6 +461,7 @@
<< "->OnMessageReceived(): Received an unknown PPID "
<< message.ppid().value()
<< " on an SCTP packet. Dropping.";
+ return;
}
receive_data_params.type = *type;
receive_buffer_.Clear();
diff --git a/media/sctp/dcsctp_transport_unittest.cc b/media/sctp/dcsctp_transport_unittest.cc
index 08dc2ec..cb1ddec 100644
--- a/media/sctp/dcsctp_transport_unittest.cc
+++ b/media/sctp/dcsctp_transport_unittest.cc
@@ -31,7 +31,7 @@
namespace webrtc {
namespace {
-class MockDataChannelObserver : public DataChannelSink {
+class MockDataChannelSink : public DataChannelSink {
public:
MOCK_METHOD(void, OnConnected, ());
@@ -45,6 +45,8 @@
MOCK_METHOD(void, OnTransportClosed, (RTCError));
};
+static_assert(!std::is_abstract_v<MockDataChannelSink>);
+
class Peer {
public:
Peer() : fake_packet_transport_("transport"), simulated_clock_(1000) {
@@ -60,16 +62,15 @@
sctp_transport_ = std::make_unique<webrtc::DcSctpTransport>(
rtc::Thread::Current(), &fake_packet_transport_, &simulated_clock_,
std::move(mock_dcsctp_socket_factory));
- sctp_transport_->SetDataChannelSink(&observer_);
- sctp_transport_->SetOnConnectedCallback(
- [this]() { observer_.OnConnected(); });
+ sctp_transport_->SetDataChannelSink(&sink_);
+ sctp_transport_->SetOnConnectedCallback([this]() { sink_.OnConnected(); });
}
rtc::FakePacketTransport fake_packet_transport_;
webrtc::SimulatedClock simulated_clock_;
dcsctp::MockDcSctpSocket* socket_;
std::unique_ptr<webrtc::DcSctpTransport> sctp_transport_;
- NiceMock<MockDataChannelObserver> observer_;
+ NiceMock<MockDataChannelSink> sink_;
};
} // namespace
@@ -82,8 +83,8 @@
.Times(1)
.WillOnce(Invoke(peer_a.sctp_transport_.get(),
&dcsctp::DcSctpSocketCallbacks::OnConnected));
- EXPECT_CALL(peer_a.observer_, OnReadyToSend);
- EXPECT_CALL(peer_a.observer_, OnConnected);
+ EXPECT_CALL(peer_a.sink_, OnReadyToSend);
+ EXPECT_CALL(peer_a.sink_, OnConnected);
peer_a.sctp_transport_->Start(5000, 5000, 256 * 1024);
}
@@ -105,10 +106,10 @@
EXPECT_CALL(*peer_b.socket_, ResetStreams(ElementsAre(dcsctp::StreamID(1))))
.WillOnce(Return(dcsctp::ResetStreamsStatus::kPerformed));
- EXPECT_CALL(peer_a.observer_, OnChannelClosing(1)).Times(0);
- EXPECT_CALL(peer_b.observer_, OnChannelClosing(1));
- EXPECT_CALL(peer_a.observer_, OnChannelClosed(1));
- EXPECT_CALL(peer_b.observer_, OnChannelClosed(1));
+ EXPECT_CALL(peer_a.sink_, OnChannelClosing(1)).Times(0);
+ EXPECT_CALL(peer_b.sink_, OnChannelClosing(1));
+ EXPECT_CALL(peer_a.sink_, OnChannelClosed(1));
+ EXPECT_CALL(peer_b.sink_, OnChannelClosed(1));
}
peer_a.sctp_transport_->Start(5000, 5000, 256 * 1024);
@@ -147,10 +148,10 @@
EXPECT_CALL(*peer_b.socket_, ResetStreams(ElementsAre(dcsctp::StreamID(1))))
.WillOnce(Return(dcsctp::ResetStreamsStatus::kPerformed));
- EXPECT_CALL(peer_a.observer_, OnChannelClosing(1)).Times(0);
- EXPECT_CALL(peer_b.observer_, OnChannelClosing(1)).Times(0);
- EXPECT_CALL(peer_a.observer_, OnChannelClosed(1));
- EXPECT_CALL(peer_b.observer_, OnChannelClosed(1));
+ EXPECT_CALL(peer_a.sink_, OnChannelClosing(1)).Times(0);
+ EXPECT_CALL(peer_b.sink_, OnChannelClosing(1)).Times(0);
+ EXPECT_CALL(peer_a.sink_, OnChannelClosed(1));
+ EXPECT_CALL(peer_b.sink_, OnChannelClosed(1));
}
peer_a.sctp_transport_->Start(5000, 5000, 256 * 1024);
@@ -230,4 +231,33 @@
EXPECT_EQ(cricket::SDR_SUCCESS, result);
}
+TEST(DcSctpTransportTest, DeliversMessage) {
+ rtc::AutoThread main_thread;
+ Peer peer_a;
+
+ EXPECT_CALL(peer_a.sink_,
+ OnDataReceived(1, webrtc::DataMessageType::kBinary, _))
+ .Times(1);
+
+ peer_a.sctp_transport_->OpenStream(1);
+ peer_a.sctp_transport_->Start(5000, 5000, 256 * 1024);
+
+ static_cast<dcsctp::DcSctpSocketCallbacks*>(peer_a.sctp_transport_.get())
+ ->OnMessageReceived(
+ dcsctp::DcSctpMessage(dcsctp::StreamID(1), dcsctp::PPID(53), {0}));
+}
+
+TEST(DcSctpTransportTest, DropMessageWithUnknownPpid) {
+ rtc::AutoThread main_thread;
+ Peer peer_a;
+
+ EXPECT_CALL(peer_a.sink_, OnDataReceived(_, _, _)).Times(0);
+
+ peer_a.sctp_transport_->OpenStream(1);
+ peer_a.sctp_transport_->Start(5000, 5000, 256 * 1024);
+
+ static_cast<dcsctp::DcSctpSocketCallbacks*>(peer_a.sctp_transport_.get())
+ ->OnMessageReceived(
+ dcsctp::DcSctpMessage(dcsctp::StreamID(1), dcsctp::PPID(1337), {0}));
+}
} // namespace webrtc