From bc34a39b86247694f088a398fa8fc447fd3b0bd5 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Mon, 12 Jun 2023 18:00:47 +0200 Subject: [PATCH] fix: close socket listener when no ICMP host is set up. Prevent ICMP callbacks from other apps when ICMP must be off --- Modules/Net/readers.swift | 45 ++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/Modules/Net/readers.swift b/Modules/Net/readers.swift index 9c8dcf43..514d5ec1 100644 --- a/Modules/Net/readers.swift +++ b/Modules/Net/readers.swift @@ -637,26 +637,26 @@ internal class ConnectivityReader: Reader { override func setup() { self.interval = 1 self.addr = self.resolve() - self.setConn() - + self.openConn() self.read() } deinit { - if let source = self.socketSource { - CFRunLoopSourceInvalidate(source) - self.socketSource = nil - } - if let socket = self.socket { - CFSocketInvalidate(socket) - self.socket = nil - } - self.timeoutTimer?.invalidate() - self.timeoutTimer = nil + self.closeConn() } override func read() { - guard !self.host.isEmpty else { return } + guard !self.host.isEmpty else { + if self.socket != nil { + self.closeConn() + } + return + } + + if self.socket == nil { + self.setup() + } + if self.lastHost != self.host { self.addr = self.resolve() } @@ -681,9 +681,7 @@ internal class ConnectivityReader: Reader { } private func socketCallback(data: Data? = nil, error: CFSocketError? = nil) { - guard let data = data, validateResponse(data) else { - return - } + guard let data = data, validateResponse(data) else { return } self.status = error == nil self.isPinging = false @@ -764,7 +762,7 @@ internal class ConnectivityReader: Reader { return nil } - private func setConn() { + private func openConn() { let info = ConnectivityReaderWrapper(self) let unmanagedSocketInfo = Unmanaged.passRetained(info) var context = CFSocketContext(version: 0, info: unmanagedSocketInfo.toOpaque(), retain: nil, release: nil, copyDescription: nil) @@ -784,6 +782,19 @@ internal class ConnectivityReader: Reader { CFRunLoopAddSource(CFRunLoopGetMain(), self.socketSource, .commonModes) } + private func closeConn() { + if let source = self.socketSource { + CFRunLoopSourceInvalidate(source) + self.socketSource = nil + } + if let socket = self.socket { + CFSocketInvalidate(socket) + self.socket = nil + } + self.timeoutTimer?.invalidate() + self.timeoutTimer = nil + } + private func resolve() -> Data? { self.lastHost = self.host var streamError = CFStreamError()