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,10 +75,9 @@ public final class ToolsInstaller {
} }
public void ensureToolsAvailable() throws FileNotFoundException, NoRootException { public void ensureToolsAvailable() throws FileNotFoundException, NoRootException {
synchronized (lock) {
if (areToolsAvailable == null) { if (areToolsAvailable == null) {
synchronized (this) { final int ret = symlink();
if (areToolsAvailable == null) {
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;
@ -89,11 +89,10 @@ public final class ToolsInstaller {
areToolsAvailable = false; areToolsAvailable = false;
} }
} }
}
}
if (!areToolsAvailable) if (!areToolsAvailable)
throw new FileNotFoundException("Required tools unavailable"); throw new FileNotFoundException("Required tools unavailable");
} }
}
public int install() throws NoRootException { public int install() throws NoRootException {
if (INSTALL_DIR == null) if (INSTALL_DIR == null)