diff --git a/Tun/Punchnet/Actors/SDLContextActor.swift b/Tun/Punchnet/Actors/SDLContextActor.swift index 8bbdad9..f8c8d4e 100644 --- a/Tun/Punchnet/Actors/SDLContextActor.swift +++ b/Tun/Punchnet/Actors/SDLContextActor.swift @@ -16,6 +16,12 @@ import NIOCore enum SDLContextError: Error { case udpHoleClosed + + case dnsLocalClientClosed + case dnsLocalClientCancelled + + case dnsClientClosed + case dnsClientCancelled } actor SDLContextActor { @@ -310,11 +316,6 @@ actor SDLContextActor { SDLLogger.log("[SDLContext] dnsClient started") self.dnsClient = dnsClient - defer { - self.dnsClient?.stop() - self.dnsClient = nil - } - try await withThrowingTaskGroup { group in defer { group.cancelAll() @@ -327,6 +328,7 @@ actor SDLContextActor { let nePacket = NEPacket(data: packet, protocolFamily: 2) self.provider.packetFlow.writePacketObjects([nePacket]) } + throw SDLContextError.dnsClientClosed } group.addTask { @@ -338,7 +340,7 @@ actor SDLContextActor { throw error case .cancelled: SDLLogger.log("[SDLContext] dnsClient cancelled") - return + throw SDLContextError.dnsClientCancelled case .sendFailed(let error): SDLLogger.log("[SDLContext] dnsClient sendFailed with error: \(error)") throw error @@ -346,7 +348,15 @@ actor SDLContextActor { } } - try await group.next() + do { + try await group.next() + dnsClient.stop() + self.dnsClient = nil + } catch let err { + dnsClient.stop() + self.dnsClient = nil + throw err + } } } @@ -373,6 +383,7 @@ actor SDLContextActor { let nePacket = NEPacket(data: packet, protocolFamily: 2) self.provider.packetFlow.writePacketObjects([nePacket]) } + throw SDLContextError.dnsLocalClientClosed } group.addTask { @@ -385,7 +396,7 @@ actor SDLContextActor { throw error case .cancelled: SDLLogger.log("[SDLContext] dnsLocalClient cancelled") - return + throw SDLContextError.dnsLocalClientCancelled case .sendFailed(let error): SDLLogger.log("[SDLContext] dnsLocalClient sendFailed: \(error)") throw error @@ -395,10 +406,10 @@ actor SDLContextActor { do { try await group.next() - await self.dnsLocalClient?.stop() + await dnsLocalClient.stop() self.dnsLocalClient = nil } catch let err { - await self.dnsLocalClient?.stop() + await dnsLocalClient.stop() self.dnsLocalClient = nil throw err }