Use GNU tar format

This commit is contained in:
topjohnwu 2017-09-06 13:36:47 +08:00
parent 2ee22fd374
commit 1c06b04c45
2 changed files with 43 additions and 8 deletions

View File

@ -3,6 +3,7 @@ package com.topjohnwu.magisk.utils;
import org.kamranzafar.jtar.TarHeader; import org.kamranzafar.jtar.TarHeader;
import java.io.File; import java.io.File;
import java.util.Arrays;
public class TarEntry extends org.kamranzafar.jtar.TarEntry { public class TarEntry extends org.kamranzafar.jtar.TarEntry {
@ -10,10 +11,6 @@ public class TarEntry extends org.kamranzafar.jtar.TarEntry {
super(file, entryName); super(file, entryName);
} }
public TarEntry(byte[] headerBuf) {
super(headerBuf);
}
/* /*
* Workaround missing java.nio.file.attribute.PosixFilePermission * Workaround missing java.nio.file.attribute.PosixFilePermission
* Simply just assign a default permission to the file * Simply just assign a default permission to the file
@ -21,7 +18,47 @@ public class TarEntry extends org.kamranzafar.jtar.TarEntry {
@Override @Override
public void extractTarHeader(String entryName) { 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 = 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;
}
} }
} }

View File

@ -127,9 +127,7 @@ public class ZipUtils {
// Patch binary XML with new package name // Patch binary XML with new package name
pkg = Utils.genPackageName("com.", UNHIDE_PKG_NAME.length - 1); pkg = Utils.genPackageName("com.", UNHIDE_PKG_NAME.length - 1);
for (int i = 0; i < pkg.length(); ++i) { System.arraycopy(pkg.getBytes(), 0, xml, offset, pkg.length());
xml[offset + i] = (byte) pkg.charAt(i);
}
dest.write(xml); dest.write(xml);
} else { } else {
while((size = source.read(buffer)) != -1) { while((size = source.read(buffer)) != -1) {