diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/TarEntry.java b/app/src/main/java/com/topjohnwu/magisk/utils/TarEntry.java index 88a7f60bf..523794efb 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/TarEntry.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/TarEntry.java @@ -3,6 +3,7 @@ package com.topjohnwu.magisk.utils; import org.kamranzafar.jtar.TarHeader; import java.io.File; +import java.util.Arrays; public class TarEntry extends org.kamranzafar.jtar.TarEntry { @@ -10,10 +11,6 @@ public class TarEntry extends org.kamranzafar.jtar.TarEntry { super(file, entryName); } - public TarEntry(byte[] headerBuf) { - super(headerBuf); - } - /* * Workaround missing java.nio.file.attribute.PosixFilePermission * Simply just assign a default permission to the file @@ -21,7 +18,47 @@ public class TarEntry extends org.kamranzafar.jtar.TarEntry { @Override public void extractTarHeader(String entryName) { - int permissions = file.isDirectory() ? 040755 : 0100644; + int permissions = file.isDirectory() ? 000755 : 000644; header = TarHeader.createHeader(entryName, file.length(), file.lastModified() / 1000, file.isDirectory(), permissions); + header.userName = new StringBuffer(""); + header.groupName = header.userName; + } + + /* + * Rewrite the header to GNU format + * */ + + @Override + public void writeEntryHeader(byte[] outbuf) { + super.writeEntryHeader(outbuf); + + System.arraycopy("ustar \0".getBytes(), 0, outbuf, 257, TarHeader.USTAR_MAGICLEN); + getOctalBytes(header.mode, outbuf, 100, TarHeader.MODELEN); + getOctalBytes(header.userId, outbuf, 108, TarHeader.UIDLEN); + getOctalBytes(header.groupId, outbuf, 116, TarHeader.GIDLEN); + getOctalBytes(header.size, outbuf, 124, TarHeader.SIZELEN); + getOctalBytes(header.modTime, outbuf, 136, TarHeader.MODTIMELEN); + Arrays.fill(outbuf, 148, 148 + TarHeader.CHKSUMLEN, (byte) ' '); + Arrays.fill(outbuf, 329, 329 + TarHeader.USTAR_DEVLEN, (byte) '\0'); + Arrays.fill(outbuf, 337, 337 + TarHeader.USTAR_DEVLEN, (byte) '\0'); + + // Recalculate checksum + getOctalBytes(computeCheckSum(outbuf), outbuf, 148, TarHeader.CHKSUMLEN); + } + + /* + * Proper octal to ASCII conversion + * */ + + private void getOctalBytes(long value, byte[] buf, int offset, int length) { + int idx = length - 1; + + buf[offset + idx] = 0; + --idx; + + for (long val = value; idx >= 0; --idx) { + buf[offset + idx] = (byte) ((byte) '0' + (byte) (val & 7)); + val = val >> 3; + } } } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/ZipUtils.java b/app/src/main/java/com/topjohnwu/magisk/utils/ZipUtils.java index 45c4de6e9..d82947bb0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/ZipUtils.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/ZipUtils.java @@ -127,9 +127,7 @@ public class ZipUtils { // Patch binary XML with new package name pkg = Utils.genPackageName("com.", UNHIDE_PKG_NAME.length - 1); - for (int i = 0; i < pkg.length(); ++i) { - xml[offset + i] = (byte) pkg.charAt(i); - } + System.arraycopy(pkg.getBytes(), 0, xml, offset, pkg.length()); dest.write(xml); } else { while((size = source.read(buffer)) != -1) {