diff --git a/jadx-cli/src/main/java/jadx/cli/tools/ConvertArscFile.java b/jadx-cli/src/main/java/jadx/cli/tools/ConvertArscFile.java index 5f813435a49..a4088efb79c 100644 --- a/jadx-cli/src/main/java/jadx/cli/tools/ConvertArscFile.java +++ b/jadx-cli/src/main/java/jadx/cli/tools/ConvertArscFile.java @@ -1,6 +1,5 @@ package jadx.cli.tools; -import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; @@ -71,7 +70,7 @@ public static void main(String[] args) throws IOException { } } else { // Load resources.arsc from extracted file - try (InputStream inputStream = new BufferedInputStream(Files.newInputStream(resFile))) { + try (InputStream inputStream = Files.newInputStream(resFile)) { resTableParser.decode(inputStream); } } diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ParserStream.java b/jadx-core/src/main/java/jadx/core/xmlgen/ParserStream.java index 46293f565e7..3346126a51f 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ParserStream.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ParserStream.java @@ -18,6 +18,7 @@ public class ParserStream { private final InputStream input; private long readPos = 0; + private long markPos = 0; public ParserStream(@NotNull InputStream inputStream) { this.input = inputStream; @@ -143,10 +144,12 @@ public void mark(int len) throws IOException { throw new IOException("Mark not supported for input stream " + input.getClass()); } input.mark(len); + markPos = readPos; } public void reset() throws IOException { input.reset(); + readPos = markPos; } public void readFully(byte[] b) throws IOException { diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ResTableBinaryParser.java b/jadx-core/src/main/java/jadx/core/xmlgen/ResTableBinaryParser.java index 6f9b325706e..267b3036ce5 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ResTableBinaryParser.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ResTableBinaryParser.java @@ -1,5 +1,6 @@ package jadx.core.xmlgen; +import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -79,7 +80,7 @@ public ResTableBinaryParser(RootNode root, boolean useRawResNames) { @Override public void decode(InputStream inputStream) throws IOException { long start = System.currentTimeMillis(); - is = new ParserStream(inputStream); + is = new ParserStream(new BufferedInputStream(inputStream, 32768)); resStorage = new ResourceStorage(root.getArgs().getSecurity()); decodeTableChunk(); resStorage.finish(); @@ -234,6 +235,7 @@ private void parseTypeChunk(long start, PackageChunk pkg) throws IOException { /* int size = */ long chunkSize = is.readUInt32(); long chunkEnd = start + chunkSize; + is.mark((int) chunkSize); // The type identifier this chunk is holding. Type IDs start at 1 (corresponding // to the value of the type bits in a resource identifier). 0 is invalid. @@ -286,7 +288,12 @@ private void parseTypeChunk(long start, PackageChunk pkg) throws IOException { LOG.warn("End of chunk reached - ignoring remaining {} entries", entryCount - index); break; } - is.checkPos(entriesStart + offset, "Expected start of entry " + index); + long entryStartOffset = entriesStart + offset; + if (entryStartOffset < is.getPos()) { + // workaround for issue #2343: if the entryStartOffset is located before our current position + is.reset(); + } + is.skipToPos(entryStartOffset, "Expected start of entry " + index); parseEntry(pkg, id, index, config.getQualifiers()); } if (chunkEnd > is.getPos()) {