Compare commits

...

2 Commits

7 changed files with 53 additions and 23 deletions
+5 -1
View File
@@ -76,6 +76,11 @@ set_target_properties(${PROJECT} PROPERTIES
XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks" XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks"
XCODE_EMBED_APP_EXTENSIONS networkextension XCODE_EMBED_APP_EXTENSIONS networkextension
# Ensure dSYM generation for App Store symbolication
XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=RelWithDebInfo] "dwarf-with-dsym"
XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Release] "dwarf-with-dsym"
XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=RelWithDebInfo] "YES"
XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Release] "YES"
) )
if(DEFINED DEPLOY) if(DEFINED DEPLOY)
@@ -141,4 +146,3 @@ set_property(TARGET ${PROJECT} PROPERTY XCODE_EMBED_FRAMEWORKS
set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/apple/OpenVPNAdapter-ios/) set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/apple/OpenVPNAdapter-ios/)
target_link_libraries("networkextension" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/apple/OpenVPNAdapter-ios/OpenVPNAdapter.framework") target_link_libraries("networkextension" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/3rd-prebuilt/3rd-prebuilt/openvpn/apple/OpenVPNAdapter-ios/OpenVPNAdapter.framework")
+5
View File
@@ -88,6 +88,11 @@ set_target_properties(${PROJECT} PROPERTIES
XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks" XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks"
XCODE_EMBED_APP_EXTENSIONS AmneziaVPNNetworkExtension XCODE_EMBED_APP_EXTENSIONS AmneziaVPNNetworkExtension
# Ensure dSYM generation for App Store symbolication
XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=RelWithDebInfo] "dwarf-with-dsym"
XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Release] "dwarf-with-dsym"
XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=RelWithDebInfo] "YES"
XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Release] "YES"
) )
if(DEPLOY) if(DEPLOY)
@@ -26,6 +26,11 @@ set_target_properties(networkextension PROPERTIES
XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2"
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../Frameworks" XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../Frameworks"
# Ensure dSYM generation for symbolication
XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=RelWithDebInfo] "dwarf-with-dsym"
XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Release] "dwarf-with-dsym"
XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=RelWithDebInfo] "YES"
XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Release] "YES"
) )
if(DEPLOY) if(DEPLOY)
@@ -25,6 +25,11 @@ set_target_properties(AmneziaVPNNetworkExtension PROPERTIES
XCODE_ATTRIBUTE_INFOPLIST_FILE ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in XCODE_ATTRIBUTE_INFOPLIST_FILE ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../../../Frameworks @loader_path/../../../../Frameworks" XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../../../Frameworks @loader_path/../../../../Frameworks"
# Ensure dSYM generation for App Store symbolication
XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=RelWithDebInfo] "dwarf-with-dsym"
XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Release] "dwarf-with-dsym"
XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=RelWithDebInfo] "YES"
XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Release] "YES"
) )
if(DEPLOY) if(DEPLOY)
+18 -9
View File
@@ -10,6 +10,8 @@ public enum Socks5Tunnel {
_ = strcpy($0, "com.apple.net.utun_control") _ = strcpy($0, "com.apple.net.utun_control")
} }
} }
func scanForUtun() -> Int32? {
for fd: Int32 in 0...1024 { for fd: Int32 in 0...1024 {
var addr = sockaddr_ctl() var addr = sockaddr_ctl()
var ret: Int32 = -1 var ret: Int32 = -1
@@ -19,19 +21,25 @@ public enum Socks5Tunnel {
ret = getpeername(fd, $0, &len) ret = getpeername(fd, $0, &len)
} }
} }
if ret != 0 || addr.sc_family != AF_SYSTEM { if ret != 0 || addr.sc_family != AF_SYSTEM { continue }
continue
}
if ctlInfo.ctl_id == 0 { if ctlInfo.ctl_id == 0 {
ret = ioctl(fd, CTLIOCGINFO, &ctlInfo) ret = ioctl(fd, CTLIOCGINFO, &ctlInfo)
if ret != 0 { if ret != 0 { continue }
continue
} }
if addr.sc_id == ctlInfo.ctl_id { return fd }
} }
if addr.sc_id == ctlInfo.ctl_id { return nil
return fd
}
} }
// On newer iOS versions, utun can appear slightly after settings
// application. Poll briefly rather than aborting.
let deadline = Date().addingTimeInterval(3.0)
repeat {
if let fd = scanForUtun() { return fd }
// Sleep a bit to avoid busy-waiting
usleep(50_000) // 50ms
} while Date() < deadline
return nil return nil
} }
@@ -63,7 +71,8 @@ public enum Socks5Tunnel {
@discardableResult @discardableResult
public static func run(withConfig filePath: String) -> Int32 { public static func run(withConfig filePath: String) -> Int32 {
guard let fileDescriptor = self.tunnelFileDescriptor else { guard let fileDescriptor = self.tunnelFileDescriptor else {
fatalError("Get tunnel file descriptor failed.") // Tunnel FD not ready; do not crash the extension
return -1
} }
return hev_socks5_tunnel_main(filePath.cString(using: .utf8), fileDescriptor) return hev_socks5_tunnel_main(filePath.cString(using: .utf8), fileDescriptor)
} }
@@ -89,7 +89,9 @@ extension PacketTunnelProvider {
errorNotifier.notify(PacketTunnelProviderError.couldNotStartBackend) errorNotifier.notify(PacketTunnelProviderError.couldNotStartBackend)
completionHandler(PacketTunnelProviderError.couldNotStartBackend) completionHandler(PacketTunnelProviderError.couldNotStartBackend)
case .invalidState: case .invalidState:
fatalError() wg_log(.error, staticMessage: "Starting tunnel failed: invalid adapter state")
errorNotifier.notify(PacketTunnelProviderError.couldNotStartBackend)
completionHandler(PacketTunnelProviderError.couldNotStartBackend)
} }
} }
} catch { } catch {
@@ -15,9 +15,9 @@ extension Constants {
if let cachesDirectoryURL = FileManager.default.urls(for: .cachesDirectory, if let cachesDirectoryURL = FileManager.default.urls(for: .cachesDirectory,
in: .userDomainMask).first { in: .userDomainMask).first {
return cachesDirectoryURL return cachesDirectoryURL
} else {
fatalError("Unable to retrieve caches directory.")
} }
// Fallback to temporaryDirectory rather than crashing
return FileManager.default.temporaryDirectory
}() }()
} }