From 47e918bc9272fcd2909d51c277e0de0687b60883 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Mon, 1 Jul 2024 03:20:09 -0700 Subject: [PATCH] Fix vbmeta.img tar patching --- .../magisk/core/tasks/MagiskInstaller.kt | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt b/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt index b149320ac..accb72f3a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt @@ -226,10 +226,10 @@ abstract class MagiskInstallImpl protected constructor( tarOut: TarArchiveOutputStream ): BootItem { console.add("- Processing tar file") - lateinit var entry: TarArchiveEntry + var entry: TarArchiveEntry? = tarIn.nextEntry - fun decompressedStream(): InputStream { - val stream = if (entry.name.endsWith(".lz4")) + fun TarArchiveEntry.decompressedStream(): InputStream { + val stream = if (name.endsWith(".lz4")) FramedLZ4CompressorInputStream(tarIn, true) else tarIn return NoAvailableStream(stream) } @@ -238,9 +238,7 @@ abstract class MagiskInstallImpl protected constructor( var initBoot: BootItem? = null var recovery: BootItem? = null - while (true) { - entry = tarIn.nextEntry ?: break - + while (entry != null) { val bootItem: BootItem? if (entry.name.startsWith("boot.img")) { bootItem = BootItem(entry) @@ -257,9 +255,9 @@ abstract class MagiskInstallImpl protected constructor( if (bootItem != null) { console.add("-- Extracting: ${bootItem.name}") - decompressedStream().copyAndCloseOut(bootItem.file.newOutputStream()) + entry.decompressedStream().copyAndCloseOut(bootItem.file.newOutputStream()) } else if (entry.name.contains("vbmeta.img")) { - val rawData = decompressedStream().readBytes() + val rawData = entry.decompressedStream().readBytes() // Valid vbmeta.img should be at least 256 bytes if (rawData.size < 256) continue @@ -274,23 +272,28 @@ abstract class MagiskInstallImpl protected constructor( // AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED ByteBuffer.wrap(rawData).putInt(120, 3) + // Fetch the next entry first before modifying current entry + val vbmeta = entry + entry = tarIn.nextEntry + // Update entry with new information - entry.name = name - entry.size = rawData.size.toLong() + vbmeta.name = name + vbmeta.size = rawData.size.toLong() // Write output - tarOut.putArchiveEntry(entry) + tarOut.putArchiveEntry(vbmeta) tarOut.write(rawData) tarOut.closeArchiveEntry() + continue } else if (entry.name.contains("userdata.img")) { console.add("-- Skipping : ${entry.name}") - continue } else { console.add("-- Copying : ${entry.name}") tarOut.putArchiveEntry(entry) tarIn.copyAll(tarOut, bufferSize = 1024 * 1024) tarOut.closeArchiveEntry() } + entry = tarIn.nextEntry ?: break } // Patch priority: recovery > init_boot > boot