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 <lnilsson@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Commit-Queue: Peter Hanspers <peterhanspers@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#34917}
diff --git a/sdk/objc/components/network/RTCNetworkMonitor+Private.h b/sdk/objc/components/network/RTCNetworkMonitor+Private.h
index 89866ea..b5c786b 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 8ac7d3a..7ac4946 100644
--- a/sdk/objc/components/network/RTCNetworkMonitor.mm
+++ b/sdk/objc/components/network/RTCNetworkMonitor.mm
@@ -88,7 +88,12 @@
rtc::AdapterType adapterType = AdapterTypeFromInterfaceType(interfaceType);
map->insert(std::pair<std::string, rtc::AdapterType>(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 @@
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 2fc84df..14ed733 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() {
+ [network_monitor_ stop];
network_monitor_ = nil;
}
@@ -50,6 +51,7 @@
return;
}
safety_flag_->SetNotAlive();
+ [network_monitor_ stop];
network_monitor_ = nil;
started_ = false;
}