summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArne Schwabe <arne@rfc2549.org>2022-03-16 14:59:32 +0100
committerArne Schwabe <arne@rfc2549.org>2022-03-16 14:59:32 +0100
commit3a674d30e1c7118b73efaf353cea7c43a95dc8c7 (patch)
tree5cfbe1d7b2d090b5ffb89656bfcec667ae613065
parentee1f7d1c4792d3045e6b52f084c6e95f4645c4ee (diff)
Change order of registering devicestatereceiver (closes #1254)
This hopefully addresses the race condition mentioned in #1254.
-rw-r--r--main/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java7
-rw-r--r--main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java48
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);