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 final File localBinaryDir;
private final Object lock = new Object();
private final File nativeLibraryDir;
private final RootShell rootShell;
private Boolean areToolsAvailable;
@ -74,10 +75,9 @@ public final class ToolsInstaller {
}
public void ensureToolsAvailable() throws FileNotFoundException, NoRootException {
synchronized (lock) {
if (areToolsAvailable == null) {
synchronized (this) {
if (areToolsAvailable == null) {
int ret = symlink();
final int ret = symlink();
if (ret == OsConstants.EALREADY) {
Log.d(TAG, "Tools were already symlinked into our private binary dir");
areToolsAvailable = true;
@ -89,11 +89,10 @@ public final class ToolsInstaller {
areToolsAvailable = false;
}
}
}
}
if (!areToolsAvailable)
throw new FileNotFoundException("Required tools unavailable");
}
}
public int install() throws NoRootException {
if (INSTALL_DIR == null)