From c7c412a36cbea0812122985872d1fcb34f688f80 Mon Sep 17 00:00:00 2001 From: Taylor Brandstetter Date: Mon, 13 Jul 2020 11:51:49 -0700 Subject: [PATCH] Check for null before accessing SctpTransport map. Bug: chromium:1104061 Change-Id: I52d44ff1603341777a873e747c625665bc11bfa5 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/179161 Commit-Queue: Taylor Reviewed-by: Harald Alvestrand Cr-Commit-Position: refs/heads/master@{#31720} --- media/sctp/sctp_transport.cc | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/media/sctp/sctp_transport.cc b/media/sctp/sctp_transport.cc index 9bfc766152..929227c356 100644 --- a/media/sctp/sctp_transport.cc +++ b/media/sctp/sctp_transport.cc @@ -311,18 +311,21 @@ class SctpTransport::UsrSctpWrapper { } static void UninitializeUsrSctp() { - delete g_transport_map_; RTC_LOG(LS_INFO) << __FUNCTION__; // usrsctp_finish() may fail if it's called too soon after the transports // are // closed. Wait and try again until it succeeds for up to 3 seconds. for (size_t i = 0; i < 300; ++i) { if (usrsctp_finish() == 0) { + delete g_transport_map_; + g_transport_map_ = nullptr; return; } rtc::Thread::SleepMs(10); } + delete g_transport_map_; + g_transport_map_ = nullptr; RTC_LOG(LS_ERROR) << "Failed to shutdown usrsctp."; } @@ -349,6 +352,11 @@ class SctpTransport::UsrSctpWrapper { size_t length, uint8_t tos, uint8_t set_df) { + if (!g_transport_map_) { + RTC_LOG(LS_ERROR) + << "OnSctpOutboundPacket called after usrsctp uninitialized?"; + return EINVAL; + } SctpTransport* transport = g_transport_map_->Retrieve(reinterpret_cast(addr)); if (!transport) { @@ -405,6 +413,12 @@ class SctpTransport::UsrSctpWrapper { // id of the transport that created them, so [0] is as good as any other. struct sockaddr_conn* sconn = reinterpret_cast(&addrs[0]); + if (!g_transport_map_) { + RTC_LOG(LS_ERROR) + << "GetTransportFromSocket called after usrsctp uninitialized?"; + usrsctp_freeladdrs(addrs); + return nullptr; + } SctpTransport* transport = g_transport_map_->Retrieve( reinterpret_cast(sconn->sconn_addr)); usrsctp_freeladdrs(addrs);