diff options
| -rw-r--r-- | core/java/android/os/RecoverySystem.java | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index ddcd63520549..b25b33d00aa8 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -434,25 +434,35 @@ public class RecoverySystem { String filename = packageFile.getCanonicalPath(); Log.w(TAG, "!!! REBOOTING TO INSTALL " + filename + " !!!"); - if (!processed && filename.startsWith("/data/")) { - FileWriter uncryptFile = new FileWriter(UNCRYPT_PACKAGE_FILE); - try { - uncryptFile.write(filename + "\n"); - } finally { - uncryptFile.close(); - } - // UNCRYPT_PACKAGE_FILE needs to be readable and writable by system server. - if (!UNCRYPT_PACKAGE_FILE.setReadable(true, false) - || !UNCRYPT_PACKAGE_FILE.setWritable(true, false)) { - Log.e(TAG, "Error setting permission for " + UNCRYPT_PACKAGE_FILE); - } + // If the package is on the /data partition, the package needs to + // be processed (i.e. uncrypt'd). The caller specifies if that has + // been done in 'processed' parameter. + if (filename.startsWith("/data/")) { + if (processed) { + if (!BLOCK_MAP_FILE.exists()) { + Log.e(TAG, "Package claimed to have been processed but failed to find " + + "the block map file."); + throw new IOException("Failed to find block map file"); + } + } else { + FileWriter uncryptFile = new FileWriter(UNCRYPT_PACKAGE_FILE); + try { + uncryptFile.write(filename + "\n"); + } finally { + uncryptFile.close(); + } + // UNCRYPT_PACKAGE_FILE needs to be readable and writable + // by system server. + if (!UNCRYPT_PACKAGE_FILE.setReadable(true, false) + || !UNCRYPT_PACKAGE_FILE.setWritable(true, false)) { + Log.e(TAG, "Error setting permission for " + UNCRYPT_PACKAGE_FILE); + } - BLOCK_MAP_FILE.delete(); - } + BLOCK_MAP_FILE.delete(); + } - // If the package is on the /data partition, use the block map file as - // the package name instead. - if (filename.startsWith("/data/")) { + // If the package is on the /data partition, use the block map + // file as the package name instead. filename = "@/cache/recovery/block.map"; } |