From 09c207b8a31cecf77e42701ca86ee772a0a598b1 Mon Sep 17 00:00:00 2001 From: Samuel Holland Date: Tue, 16 Jan 2018 05:47:10 -0600 Subject: [PATCH] ToolsInstaller: Remove double-checked locking It can't work and may be crashing the runtime. Use a lock object to avoid exposing the synchronization in the class's interface. Signed-off-by: Samuel Holland --- .../android/util/ToolsInstaller.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java b/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java index dca410f0..2aa35957 100644 --- a/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java +++ b/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java @@ -34,6 +34,7 @@ public final class ToolsInstaller { private static final String TAG = "WireGuard/" + ToolsInstaller.class.getSimpleName(); private final File localBinaryDir; + private final Object lock = new Object(); private final File nativeLibraryDir; private final RootShell rootShell; private Boolean areToolsAvailable; @@ -74,25 +75,23 @@ public final class ToolsInstaller { } public void ensureToolsAvailable() throws FileNotFoundException, NoRootException { - if (areToolsAvailable == null) { - synchronized (this) { - if (areToolsAvailable == null) { - int ret = symlink(); - if (ret == OsConstants.EALREADY) { - Log.d(TAG, "Tools were already symlinked into our private binary dir"); - areToolsAvailable = true; - } else if (ret == OsConstants.EXIT_SUCCESS) { - Log.d(TAG, "Tools are now symlinked into our private binary dir"); - areToolsAvailable = true; - } else { - Log.e(TAG, "For some reason, wg and wg-quick are not available at all"); - areToolsAvailable = false; - } + synchronized (lock) { + if (areToolsAvailable == null) { + final int ret = symlink(); + if (ret == OsConstants.EALREADY) { + Log.d(TAG, "Tools were already symlinked into our private binary dir"); + areToolsAvailable = true; + } else if (ret == OsConstants.EXIT_SUCCESS) { + Log.d(TAG, "Tools are now symlinked into our private binary dir"); + areToolsAvailable = true; + } else { + Log.e(TAG, "For some reason, wg and wg-quick are not available at all"); + areToolsAvailable = false; } } + if (!areToolsAvailable) + throw new FileNotFoundException("Required tools unavailable"); } - if (!areToolsAvailable) - throw new FileNotFoundException("Required tools unavailable"); } public int install() throws NoRootException {