fix: close socket listener when no ICMP host is set up. Prevent ICMP callbacks from other apps when ICMP must be off

This commit is contained in:
Serhiy Mytrovtsiy
2023-06-12 18:00:47 +02:00
parent cc94429c49
commit bc34a39b86

View File

@@ -637,26 +637,26 @@ internal class ConnectivityReader: Reader<Bool> {
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<Bool> {
}
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<Bool> {
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<Bool> {
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()