@@ -48,16 +48,17 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
48
48
options _: [ String : NSObject ] ? , completionHandler: @escaping ( Error ? ) -> Void
49
49
) {
50
50
logger. info ( " startTunnel called " )
51
+ guard manager == nil else {
52
+ logger. error ( " startTunnel called with non-nil Manager " )
53
+ // If the tunnel is already running, then we can just mark as connected.
54
+ completionHandler ( nil )
55
+ return
56
+ }
51
57
start ( completionHandler)
52
58
}
53
59
54
60
// called by `startTunnel` and on `wake`
55
61
func start( _ completionHandler: @escaping ( Error ? ) -> Void ) {
56
- guard manager == nil else {
57
- logger. error ( " startTunnel called with non-nil Manager " )
58
- completionHandler ( makeNSError ( suffix: " PTP " , desc: " Already running " ) )
59
- return
60
- }
61
62
guard let proto = protocolConfiguration as? NETunnelProviderProtocol ,
62
63
let baseAccessURL = proto. serverAddress
63
64
else {
@@ -123,9 +124,11 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
123
124
logger. error ( " error stopping manager: \( error. description, privacy: . public) " )
124
125
}
125
126
globalXPCListenerDelegate. vpnXPCInterface. manager = nil
127
+ // Mark teardown as complete by setting manager to nil, and
128
+ // calling the completion handler.
129
+ self . manager = nil
126
130
completionHandler ( )
127
131
}
128
- self . manager = nil
129
132
}
130
133
131
134
override func handleAppMessage( _ messageData: Data , completionHandler: ( ( Data ? ) -> Void ) ? ) {
@@ -142,6 +145,13 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
142
145
}
143
146
144
147
override func wake( ) {
148
+ // It's possible the tunnel is still starting up, if it is, wake should
149
+ // be a no-op.
150
+ guard !reasserting else { return }
151
+ guard manager == nil else {
152
+ logger. error ( " wake called with non-nil Manager " )
153
+ return
154
+ }
145
155
logger. debug ( " wake called " )
146
156
reasserting = true
147
157
currentSettings = . init( tunnelRemoteAddress: " 127.0.0.1 " )
0 commit comments