mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-14 00:04:15 +09:00
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:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user