From b7864d6ac2e979e6c299d145447afd1203510c02 Mon Sep 17 00:00:00 2001 From: Leonid Plyushch Date: Fri, 29 Jun 2018 14:43:38 +0300 Subject: [PATCH] deleteFolder(): check if passed argument is a symlink Prevents possible data loss when user replaced directory '~/storage' with a symlink. --- .../main/java/com/termux/app/TermuxInstaller.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/termux/app/TermuxInstaller.java b/app/src/main/java/com/termux/app/TermuxInstaller.java index 0ea5a46b..26e798ee 100644 --- a/app/src/main/java/com/termux/app/TermuxInstaller.java +++ b/app/src/main/java/com/termux/app/TermuxInstaller.java @@ -209,18 +209,18 @@ final class TermuxInstaller { Arrays.toString(Build.SUPPORTED_ABIS)); } - /** Delete a folder and all its content or throw. */ + /** Delete a folder and all its content or throw. Don't follow symlinks. */ static void deleteFolder(File fileOrDirectory) throws IOException { - File[] children = fileOrDirectory.listFiles(); - if (children != null) { - for (File child : children) { - if (child.getCanonicalFile().equals(child.getAbsoluteFile())) { + if (fileOrDirectory.getCanonicalPath().equals(fileOrDirectory.getAbsolutePath()) && fileOrDirectory.isDirectory()) { + File[] children = fileOrDirectory.listFiles(); + + if (children != null) { + for (File child : children) { deleteFolder(child); - } else { - child.delete(); } } } + if (!fileOrDirectory.delete()) { throw new RuntimeException("Unable to delete " + (fileOrDirectory.isDirectory() ? "directory " : "file ") + fileOrDirectory.getAbsolutePath()); }