Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36baafe9 authored by Tao Bao's avatar Tao Bao
Browse files

Don't reboot into recovery if block map file is missing.

We added a third parameter to RecoverySystem.installPackage() to let the
caller to indicate the package has been processed (uncrypt'd). We need
to ensure the caller's claim is true by checking the existence of the
block map. Otherwise the device will fail for sure when booting into
recovery.

Bug: 27620932
Change-Id: I6325455253480055f14eb0cf020689ac37328602
parent 658e4c5e
Loading
Loading
Loading
Loading
+27 −17
Original line number Diff line number Diff line
@@ -434,14 +434,25 @@ public class RecoverySystem {
            String filename = packageFile.getCanonicalPath();
            Log.w(TAG, "!!! REBOOTING TO INSTALL " + filename + " !!!");

            if (!processed && filename.startsWith("/data/")) {
            // 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.
                    // 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);
@@ -450,9 +461,8 @@ public class RecoverySystem {
                    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";
            }