From 79af2787ae793cf0a149a39aee173d518bd30ac3 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Thu, 13 Feb 2025 22:04:14 -0800 Subject: [PATCH] Workaround potential OOM when signing APKs --- .../com/topjohnwu/magisk/core/signing/ByteArrayStream.java | 5 +++++ .../main/java/com/topjohnwu/magisk/core/signing/SignApk.java | 5 ++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/signing/ByteArrayStream.java b/app/core/src/main/java/com/topjohnwu/magisk/core/signing/ByteArrayStream.java index c3cad9f38..0454a5fef 100644 --- a/app/core/src/main/java/com/topjohnwu/magisk/core/signing/ByteArrayStream.java +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/signing/ByteArrayStream.java @@ -4,6 +4,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.ByteBuffer; public class ByteArrayStream extends ByteArrayOutputStream { @@ -27,4 +28,8 @@ public class ByteArrayStream extends ByteArrayOutputStream { public ByteArrayInputStream getInputStream() { return new ByteArrayInputStream(buf, 0, count); } + + public ByteBuffer toByteBuffer() { + return ByteBuffer.wrap(buf, 0, count); + } } diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/signing/SignApk.java b/app/core/src/main/java/com/topjohnwu/magisk/core/signing/SignApk.java index 6a43b3fbe..bbe8cb64c 100644 --- a/app/core/src/main/java/com/topjohnwu/magisk/core/signing/SignApk.java +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/signing/SignApk.java @@ -510,7 +510,7 @@ public class SignApk { privateKey[0] = key; // Generate, in memory, an APK signed using standard JAR Signature Scheme. - ByteArrayOutputStream v1SignedApkBuf = new ByteArrayOutputStream(); + ByteArrayStream v1SignedApkBuf = new ByteArrayStream(); JarOutputStream outputJar = new JarOutputStream(v1SignedApkBuf); // Use maximum compression for compressed entries because the APK lives forever on // the system partition. @@ -519,8 +519,7 @@ public class SignApk { copyFiles(manifest, inputJar, outputJar, timestamp, alignment); signFile(manifest, publicKey, privateKey, timestamp, outputJar); outputJar.close(); - ByteBuffer v1SignedApk = ByteBuffer.wrap(v1SignedApkBuf.toByteArray()); - v1SignedApkBuf.reset(); + ByteBuffer v1SignedApk = v1SignedApkBuf.toByteBuffer(); ByteBuffer[] outputChunks; List signerConfigs = createV2SignerConfigs(privateKey, publicKey,