From 3a674d30e1c7118b73efaf353cea7c43a95dc8c7 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Wed, 16 Mar 2022 14:59:32 +0100 Subject: Change order of registering devicestatereceiver (closes #1254) This hopefully addresses the race condition mentioned in #1254. --- .../blinkt/openvpn/core/DeviceStateReceiver.java | 7 ++-- .../de/blinkt/openvpn/core/OpenVPNService.java | 48 ++++++++++++---------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/main/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java b/main/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java index 7b5946a3..22ade800 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java +++ b/main/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java @@ -13,6 +13,7 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.NetworkInfo.State; import android.os.Handler; +import android.os.Looper; import android.preference.PreferenceManager; import de.blinkt.openvpn.R; @@ -126,11 +127,11 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL } } - public DeviceStateReceiver(OpenVPNManagement magnagement) { + public DeviceStateReceiver(OpenVPNManagement management) { super(); - mManagement = magnagement; + mManagement = management; mManagement.setPauseCallback(this); - mDisconnectHandler = new Handler(); + mDisconnectHandler = new Handler(Looper.getMainLooper()); } diff --git a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java index 742e1aa5..d16dccc2 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java +++ b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java @@ -235,7 +235,8 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac mProcessThread = null; } VpnStatus.removeByteCountListener(this); - unregisterDeviceStateReceiver(); + unregisterDeviceStateReceiver(mDeviceStateReceiver); + mDeviceStateReceiver = null; ProfileManager.setConntectedVpnProfileDisconnected(this); mOpenVPNThread = null; if (!mStarting) { @@ -439,13 +440,12 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac } - synchronized void registerDeviceStateReceiver(OpenVPNManagement magnagement) { + synchronized void registerDeviceStateReceiver() { // Registers BroadcastReceiver to track network connection changes. IntentFilter filter = new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); - mDeviceStateReceiver = new DeviceStateReceiver(magnagement); // Fetch initial network state mDeviceStateReceiver.networkStateChange(this); @@ -457,19 +457,17 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac addLollipopCMListener(); */ } - synchronized void unregisterDeviceStateReceiver() { + synchronized void unregisterDeviceStateReceiver(DeviceStateReceiver deviceStateReceiver) { if (mDeviceStateReceiver != null) try { - VpnStatus.removeByteCountListener(mDeviceStateReceiver); - this.unregisterReceiver(mDeviceStateReceiver); + VpnStatus.removeByteCountListener(deviceStateReceiver); + this.unregisterReceiver(deviceStateReceiver); } catch (IllegalArgumentException iae) { // I don't know why this happens: // java.lang.IllegalArgumentException: Receiver not registered: de.blinkt.openvpn.NetworkSateReceiver@41a61a10 // Ignore for now ... iae.printStackTrace(); } - mDeviceStateReceiver = null; - /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) removeLollipopCMListener();*/ @@ -632,28 +630,33 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac mManagement = mOpenVPN3; } else { processThread = new OpenVPNThread(this, argv, nativeLibraryDirectory, tmpDir); - mOpenVPNThread = processThread; } + mProcessThread = new Thread(processThread, "OpenVPNProcessThread"); + synchronized (mProcessLock) { - mProcessThread = new Thread(processThread, "OpenVPNProcessThread"); mProcessThread.start(); } - - try { - mProfile.writeConfigFileOutput(this, ((OpenVPNThread)processThread).getOpenVPNStdin()); - } catch (IOException | ExecutionException | InterruptedException e) { - VpnStatus.logException("Error generating config file", e); - endVpnService(); - return; + if (!useOpenVPN3) { + try { + mProfile.writeConfigFileOutput(this, ((OpenVPNThread) processThread).getOpenVPNStdin()); + } catch (IOException | ExecutionException | InterruptedException e) { + VpnStatus.logException("Error generating config file", e); + endVpnService(); + return; + } } - boolean post = new Handler(getMainLooper()).post(() -> { - if (mDeviceStateReceiver != null) - unregisterDeviceStateReceiver(); + DeviceStateReceiver oldDeviceStateReceiver = mDeviceStateReceiver; + mDeviceStateReceiver = new DeviceStateReceiver(mManagement); + + + new Handler(getMainLooper()).post(() -> { + if (oldDeviceStateReceiver != null) + unregisterDeviceStateReceiver(oldDeviceStateReceiver); - registerDeviceStateReceiver(mManagement); + registerDeviceStateReceiver(); }); } @@ -719,7 +722,8 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac } if (mDeviceStateReceiver != null) { - unregisterDeviceStateReceiver(); + unregisterDeviceStateReceiver(mDeviceStateReceiver); + mDeviceStateReceiver = null; } // Just in case unregister for state VpnStatus.removeStateListener(this); -- cgit v1.2.3