From 0bf94aaa7cd3f863e2eeb77c24c4af7c092e6681 Mon Sep 17 00:00:00 2001 From: Peter Hanspers Date: Fri, 3 Sep 2021 13:18:41 +0200 Subject: [PATCH] Fix race condition in RTCNetworkMonitor/objc_network_monitor. Bug: webrtc:13146 Change-Id: I74d645df8847f1e003d1dc8b64e79c6ef9bce285 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/231138 Reviewed-by: Linus Nilsson Reviewed-by: Niels Moller Commit-Queue: Peter Hanspers Cr-Commit-Position: refs/heads/main@{#34917} --- .../network/RTCNetworkMonitor+Private.h | 3 +++ .../components/network/RTCNetworkMonitor.mm | 19 +++++++++++++++++-- sdk/objc/native/src/objc_network_monitor.mm | 2 ++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/sdk/objc/components/network/RTCNetworkMonitor+Private.h b/sdk/objc/components/network/RTCNetworkMonitor+Private.h index 89866ea359..b5c786be18 100644 --- a/sdk/objc/components/network/RTCNetworkMonitor+Private.h +++ b/sdk/objc/components/network/RTCNetworkMonitor+Private.h @@ -20,4 +20,7 @@ - (instancetype)initWithObserver:(webrtc::NetworkMonitorObserver *)observer NS_DESIGNATED_INITIALIZER; +/** Stops the receiver from posting updates to `observer`. */ +- (void)stop; + @end diff --git a/sdk/objc/components/network/RTCNetworkMonitor.mm b/sdk/objc/components/network/RTCNetworkMonitor.mm index 8ac7d3a0d2..7ac4946ec3 100644 --- a/sdk/objc/components/network/RTCNetworkMonitor.mm +++ b/sdk/objc/components/network/RTCNetworkMonitor.mm @@ -88,7 +88,12 @@ rtc::AdapterType AdapterTypeFromInterfaceType(nw_interface_type_t interfaceType) rtc::AdapterType adapterType = AdapterTypeFromInterfaceType(interfaceType); map->insert(std::pair(name, adapterType)); }); - strongSelf->_observer->OnPathUpdate(std::move(*map)); + @synchronized(strongSelf) { + webrtc::NetworkMonitorObserver *observer = strongSelf->_observer; + if (observer) { + observer->OnPathUpdate(std::move(*map)); + } + } delete map; }); nw_path_monitor_set_queue( @@ -100,10 +105,20 @@ rtc::AdapterType AdapterTypeFromInterfaceType(nw_interface_type_t interfaceType) return self; } -- (void)dealloc { +- (void)cancel { if (@available(iOS 12, *)) { nw_path_monitor_cancel(_pathMonitor); } } +- (void)stop { + [self cancel]; + @synchronized(self) { + _observer = nil; + } +} + +- (void)dealloc { + [self cancel]; +} @end diff --git a/sdk/objc/native/src/objc_network_monitor.mm b/sdk/objc/native/src/objc_network_monitor.mm index 2fc84dfa51..14ed73374c 100644 --- a/sdk/objc/native/src/objc_network_monitor.mm +++ b/sdk/objc/native/src/objc_network_monitor.mm @@ -27,6 +27,7 @@ ObjCNetworkMonitor::ObjCNetworkMonitor() { } ObjCNetworkMonitor::~ObjCNetworkMonitor() { + [network_monitor_ stop]; network_monitor_ = nil; } @@ -50,6 +51,7 @@ void ObjCNetworkMonitor::Stop() { return; } safety_flag_->SetNotAlive(); + [network_monitor_ stop]; network_monitor_ = nil; started_ = false; }