From 99b9a6b80a4582282ff1b8f2b7d80011f5c59935 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sat, 22 Sep 2018 04:10:31 +0200 Subject: PacketTunnelProvider: fix locking logic Signed-off-by: Jason A. Donenfeld --- WireGuardNetworkExtension/PacketTunnelProvider.swift | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/WireGuardNetworkExtension/PacketTunnelProvider.swift b/WireGuardNetworkExtension/PacketTunnelProvider.swift index 64e9f5d..9959dec 100644 --- a/WireGuardNetworkExtension/PacketTunnelProvider.swift +++ b/WireGuardNetworkExtension/PacketTunnelProvider.swift @@ -192,22 +192,19 @@ class WireGuardContext { readPacketCondition.signal() } + func packetsRead(packets: [NEPacket]) { + outboundPackets.append(contentsOf: packets) + readPacketCondition.signal() + } + func readPacket(isTunnelClosed: inout Bool) -> NEPacket? { if outboundPackets.isEmpty { - let readPacketCondition = NSCondition() readPacketCondition.lock() - var packetsObtained: [NEPacket]? - packetFlow.readPacketObjects { (packets: [NEPacket]) in - packetsObtained = packets - readPacketCondition.signal() - } + packetFlow.readPacketObjects(completionHandler: packetsRead) // Wait till the completion handler of packetFlow.readPacketObjects() finishes - while packetsObtained == nil && !self.isTunnelClosed { + while outboundPackets.isEmpty && !self.isTunnelClosed { readPacketCondition.wait() } - if let packetsObtained = packetsObtained { - outboundPackets = packetsObtained - } readPacketCondition.unlock() } isTunnelClosed = self.isTunnelClosed -- cgit v1.2.3-59-g8ed1b