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 <samuel@sholland.org>
This commit is contained in:
Samuel Holland 2018-01-16 05:47:10 -06:00
parent d56eda2fd6
commit 09c207b8a3

View File

@ -34,6 +34,7 @@ public final class ToolsInstaller {
private static final String TAG = "WireGuard/" + ToolsInstaller.class.getSimpleName(); private static final String TAG = "WireGuard/" + ToolsInstaller.class.getSimpleName();
private final File localBinaryDir; private final File localBinaryDir;
private final Object lock = new Object();
private final File nativeLibraryDir; private final File nativeLibraryDir;
private final RootShell rootShell; private final RootShell rootShell;
private Boolean areToolsAvailable; private Boolean areToolsAvailable;
@ -74,25 +75,23 @@ public final class ToolsInstaller {
} }
public void ensureToolsAvailable() throws FileNotFoundException, NoRootException { public void ensureToolsAvailable() throws FileNotFoundException, NoRootException {
if (areToolsAvailable == null) { synchronized (lock) {
synchronized (this) { if (areToolsAvailable == null) {
if (areToolsAvailable == null) { final int ret = symlink();
int ret = symlink(); if (ret == OsConstants.EALREADY) {
if (ret == OsConstants.EALREADY) { Log.d(TAG, "Tools were already symlinked into our private binary dir");
Log.d(TAG, "Tools were already symlinked into our private binary dir"); areToolsAvailable = true;
areToolsAvailable = true; } else if (ret == OsConstants.EXIT_SUCCESS) {
} else if (ret == OsConstants.EXIT_SUCCESS) { Log.d(TAG, "Tools are now symlinked into our private binary dir");
Log.d(TAG, "Tools are now symlinked into our private binary dir"); areToolsAvailable = true;
areToolsAvailable = true; } else {
} else { Log.e(TAG, "For some reason, wg and wg-quick are not available at all");
Log.e(TAG, "For some reason, wg and wg-quick are not available at all"); areToolsAvailable = false;
areToolsAvailable = false;
}
} }
} }
if (!areToolsAvailable)
throw new FileNotFoundException("Required tools unavailable");
} }
if (!areToolsAvailable)
throw new FileNotFoundException("Required tools unavailable");
} }
public int install() throws NoRootException { public int install() throws NoRootException {