From 5065e12dbe9918b3558f4fc0e0497580d5840171 Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Tue, 18 Aug 2015 12:37:02 -0700 Subject: [PATCH] Recursively delete directories in handleAftermath(). RecoverySystem.handleAftermath() is called to clean up recovery-related files. It needs to handle non-empty directories as well such as leftover stashes from failed OTAs. Bug: 23199081 Change-Id: I33fb326d376d04c793ad7b5948a10e8c1c572812 --- core/java/android/os/RecoverySystem.java | 28 ++++++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index 52b10be0e53e1..2a2ad266fcb5f 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -68,7 +68,7 @@ public class RecoverySystem { /** Send progress to listeners no more often than this (in ms). */ private static final long PUBLISH_PROGRESS_INTERVAL_MS = 500; - /** Used to communicate with recovery. See bootable/recovery/recovery.c. */ + /** Used to communicate with recovery. See bootable/recovery/recovery.cpp. */ private static File RECOVERY_DIR = new File("/cache/recovery"); private static File COMMAND_FILE = new File(RECOVERY_DIR, "command"); private static File UNCRYPT_FILE = new File(RECOVERY_DIR, "uncrypt_file"); @@ -506,17 +506,31 @@ public class RecoverySystem { String[] names = RECOVERY_DIR.list(); for (int i = 0; names != null && i < names.length; i++) { if (names[i].startsWith(LAST_PREFIX)) continue; - File f = new File(RECOVERY_DIR, names[i]); - if (!f.delete()) { - Log.e(TAG, "Can't delete: " + f); - } else { - Log.i(TAG, "Deleted: " + f); - } + recursiveDelete(new File(RECOVERY_DIR, names[i])); } return log; } + /** + * Internally, delete a given file or directory recursively. + */ + private static void recursiveDelete(File name) { + if (name.isDirectory()) { + String[] files = name.list(); + for (int i = 0; files != null && i < files.length; i++) { + File f = new File(name, files[i]); + recursiveDelete(f); + } + } + + if (!name.delete()) { + Log.e(TAG, "Can't delete: " + name); + } else { + Log.i(TAG, "Deleted: " + name); + } + } + /** * Internally, recovery treats each line of the command file as a separate * argv, so we only need to protect against newlines and nulls.