From 539f359a1feb168ca84968932295a780424a984c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Andr=C3=A9=20Vadla=20Ravn=C3=A5s?= Date: Wed, 18 Sep 2024 23:49:56 +0200 Subject: [PATCH] fruity: Handle USB TunnelConnection dropping Which happens on e.g. an iOS userspace reboot. --- src/fruity/device-monitor.vala | 12 ++++++++++++ src/fruity/xpc.vala | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/src/fruity/device-monitor.vala b/src/fruity/device-monitor.vala index d478bb78e..ad7f4ebfc 100644 --- a/src/fruity/device-monitor.vala +++ b/src/fruity/device-monitor.vala @@ -1190,6 +1190,7 @@ namespace Frida.Fruity { ncm_peer = yield NcmPeer.locate (usb_device, cancellable); tunnel = new PortableUsbTunnel (usb_device, ncm_peer, pairing_store); + tunnel.lost.connect (on_tunnel_lost); try { yield tunnel.open (cancellable); } catch (Error e) { @@ -1208,6 +1209,10 @@ namespace Frida.Fruity { throw_api_error (e); } } + + private void on_tunnel_lost () { + tunnel_request = null; + } } private class NcmPeer { @@ -1420,6 +1425,8 @@ namespace Frida.Fruity { } private sealed class PortableUsbTunnel : Object, Tunnel { + public signal void lost (); + public UsbDevice usb_device { get; construct; @@ -1474,6 +1481,7 @@ namespace Frida.Fruity { var pairing_service = yield PairingService.open (pairing_transport, pairing_store, cancellable); TunnelConnection tc = yield pairing_service.open_tunnel (ncm_peer.ip, netstack, cancellable); + tc.close.connect (on_tunnel_connection_close); var rsd_endpoint = (InetSocketAddress) Object.new (typeof (InetSocketAddress), address: tc.remote_address, @@ -1505,6 +1513,10 @@ namespace Frida.Fruity { ); return yield netstack.open_tcp_connection (endpoint, cancellable); } + + private void on_tunnel_connection_close () { + lost (); + } } private sealed class PortableCoreDeviceNetworkTransport : Object, Transport { diff --git a/src/fruity/xpc.vala b/src/fruity/xpc.vala index 50309b0e6..c7f0a12ca 100644 --- a/src/fruity/xpc.vala +++ b/src/fruity/xpc.vala @@ -1753,6 +1753,8 @@ namespace Frida.Fruity { } public sealed class TunnelConnection : Object, AsyncInitable { + public signal void close (); + public InetSocketAddress address { get; construct; @@ -2021,6 +2023,8 @@ namespace Frida.Fruity { } public void cancel () { + if (connection != null) + close (); connection = null; socket = null;