From d40ac7f89daf478f82b022bae95d65ade611c4ce Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Mon, 21 Oct 2019 18:55:35 +0200 Subject: [PATCH] ToolsInstaller: write to temporary file, fsync, rename Reported-by: Andre Christanto Signed-off-by: Jason A. Donenfeld --- .../wireguard/android/util/SharedLibraryLoader.java | 1 + .../com/wireguard/android/util/ToolsInstaller.java | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/wireguard/android/util/SharedLibraryLoader.java b/app/src/main/java/com/wireguard/android/util/SharedLibraryLoader.java index e3923d19..428c5a23 100644 --- a/app/src/main/java/com/wireguard/android/util/SharedLibraryLoader.java +++ b/app/src/main/java/com/wireguard/android/util/SharedLibraryLoader.java @@ -54,6 +54,7 @@ public final class SharedLibraryLoader { while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } + out.getFD().sync(); } return true; } 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 defdefd8..82d1e94e 100644 --- a/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java +++ b/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java @@ -149,18 +149,22 @@ public final class ToolsInstaller { public boolean extract() throws IOException { localBinaryDir.mkdirs(); final File files[] = new File[EXECUTABLES.length]; + final File tempFiles[] = new File[EXECUTABLES.length]; boolean allExist = true; for (int i = 0; i < files.length; ++i) { files[i] = new File(localBinaryDir, EXECUTABLES[i]); + tempFiles[i] = new File(localBinaryDir, EXECUTABLES[i] + ".tmp"); allExist &= files[i].exists(); } if (allExist) return false; for (int i = 0; i < files.length; ++i) { - if (!SharedLibraryLoader.extractLibrary(context, EXECUTABLES[i], files[i])) + if (!SharedLibraryLoader.extractLibrary(context, EXECUTABLES[i], tempFiles[i])) throw new FileNotFoundException("Unable to find " + EXECUTABLES[i]); - if (!files[i].setExecutable(true, false)) - throw new IOException("Unable to mark " + files[i].getAbsolutePath() + " as executable"); + if (!tempFiles[i].setExecutable(true, false)) + throw new IOException("Unable to mark " + tempFiles[i].getAbsolutePath() + " as executable"); + if (!tempFiles[i].renameTo(files[i])) + throw new IOException("Unable to rename " + tempFiles[i].getAbsolutePath() + " to " + files[i].getAbsolutePath()); } return true; }