Skip to content

Commit b043026

Browse files
committed
Avoid two simultaneously startOpenVPN by forcing serialisation via handler
1 parent df2a66a commit b043026

File tree

1 file changed

+18
-16
lines changed

1 file changed

+18
-16
lines changed

main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import android.os.Bundle;
2929
import android.os.Handler;
3030
import android.os.Handler.Callback;
31+
import android.os.HandlerThread;
3132
import android.os.IBinder;
3233
import android.os.Message;
3334
import android.os.ParcelFileDescriptor;
@@ -141,6 +142,8 @@ public void challengeResponse(String repsonse) throws RemoteException {
141142
private Toast mlastToast;
142143
private Runnable mOpenVPNThread;
143144
private ProxyInfo mProxyInfo;
145+
private HandlerThread mCommandHandlerThread;
146+
private Handler mCommandHandler;
144147

145148
// From: http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java
146149
public static String humanReadableByteCount(long bytes, boolean speed, Resources res) {
@@ -423,18 +426,18 @@ PendingIntent getGraphPendingIntent() {
423426

424427
}
425428

426-
synchronized void registerDeviceStateReceiver() {
429+
synchronized void registerDeviceStateReceiver(DeviceStateReceiver newDeviceStateReceiver) {
427430
// Registers BroadcastReceiver to track network connection changes.
428431
IntentFilter filter = new IntentFilter();
429432
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
430433
filter.addAction(Intent.ACTION_SCREEN_OFF);
431434
filter.addAction(Intent.ACTION_SCREEN_ON);
432435

433436
// Fetch initial network state
434-
mDeviceStateReceiver.networkStateChange(this);
437+
newDeviceStateReceiver.networkStateChange(this);
435438

436-
registerReceiver(mDeviceStateReceiver, filter);
437-
VpnStatus.addByteCountListener(mDeviceStateReceiver);
439+
registerReceiver(newDeviceStateReceiver, filter);
440+
VpnStatus.addByteCountListener(newDeviceStateReceiver);
438441
}
439442

440443
synchronized void unregisterDeviceStateReceiver(DeviceStateReceiver deviceStateReceiver) {
@@ -465,16 +468,12 @@ public boolean stopVPN(boolean replaceConnection) throws RemoteException {
465468

466469
@Override
467470
public int onStartCommand(Intent intent, int flags, int startId) {
468-
469471
if (intent != null && intent.getBooleanExtra(ALWAYS_SHOW_NOTIFICATION, false))
470472
mNotificationAlwaysVisible = true;
471473

472474
VpnStatus.addStateListener(this);
473475
VpnStatus.addByteCountListener(this);
474476

475-
guiHandler = new Handler(getMainLooper());
476-
477-
478477
if (intent != null && PAUSE_VPN.equals(intent.getAction())) {
479478
if (mDeviceStateReceiver != null)
480479
mDeviceStateReceiver.userPause(true);
@@ -502,7 +501,7 @@ public int onStartCommand(Intent intent, int flags, int startId) {
502501

503502

504503
/* start the OpenVPN process itself in a background thread */
505-
new Thread(() -> startOpenVPN(intent, startId)).start();
504+
mCommandHandler.post(() -> startOpenVPN(intent, startId));
506505

507506
return START_STICKY;
508507
}
@@ -609,9 +608,8 @@ private void startOpenVPN(Intent intent, int startId) {
609608
processThread = new OpenVPNThread(this, argv, nativeLibraryDirectory, tmpDir);
610609
}
611610

612-
mProcessThread = new Thread(processThread, "OpenVPNProcessThread");
613-
614611
synchronized (mProcessLock) {
612+
mProcessThread = new Thread(processThread, "OpenVPNProcessThread");
615613
mProcessThread.start();
616614
}
617615

@@ -625,15 +623,15 @@ private void startOpenVPN(Intent intent, int startId) {
625623
}
626624
}
627625

628-
DeviceStateReceiver oldDeviceStateReceiver = mDeviceStateReceiver;
629-
mDeviceStateReceiver = new DeviceStateReceiver(mManagement);
630-
626+
final DeviceStateReceiver oldDeviceStateReceiver = mDeviceStateReceiver;
627+
final DeviceStateReceiver newDeviceStateReceiver = new DeviceStateReceiver(mManagement);
631628

632-
new Handler(getMainLooper()).post(() -> {
629+
guiHandler.post(() -> {
633630
if (oldDeviceStateReceiver != null)
634631
unregisterDeviceStateReceiver(oldDeviceStateReceiver);
635632

636-
registerDeviceStateReceiver();
633+
registerDeviceStateReceiver(newDeviceStateReceiver);
634+
mDeviceStateReceiver = newDeviceStateReceiver;
637635
});
638636
}
639637

@@ -688,6 +686,10 @@ public IBinder asBinder() {
688686
@Override
689687
public void onCreate() {
690688
super.onCreate();
689+
guiHandler = new Handler(getMainLooper());
690+
mCommandHandlerThread = new HandlerThread("OpenVPNServiceCommandThread");
691+
mCommandHandlerThread.start();
692+
mCommandHandler = new Handler(mCommandHandlerThread.getLooper());
691693
}
692694

693695
@Override

0 commit comments

Comments
 (0)