From b01dce7f3a71a865a314068d0dbce3522a210726 Mon Sep 17 00:00:00 2001 From: Sebastian Rasmussen Date: Tue, 8 Jan 2019 21:16:46 +0100 Subject: [PATCH] Adapt AXMLResourceParser to handle broken headers. Fixes #1976. --- .../java/brut/androlib/res/decoder/AXmlResourceParser.java | 4 ++-- brut.j.util/src/main/java/brut/util/ExtDataInput.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/AXmlResourceParser.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/AXmlResourceParser.java index 5e64aaf4..d006a2c2 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/AXmlResourceParser.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/AXmlResourceParser.java @@ -852,7 +852,7 @@ public class AXmlResourceParser implements XmlResourceParser { private final void doNext() throws IOException { // Delayed initialization. if (m_strings == null) { - m_reader.skipCheckInt(CHUNK_AXML_FILE); + m_reader.skipCheckInt(CHUNK_AXML_FILE, CHUNK_AXML_FILE_BROKEN); /* * chunkSize @@ -1004,7 +1004,7 @@ public class AXmlResourceParser implements XmlResourceParser { ATTRIBUTE_IX_VALUE_TYPE = 3, ATTRIBUTE_IX_VALUE_DATA = 4, ATTRIBUTE_LENGTH = 5; - private static final int CHUNK_AXML_FILE = 0x00080003, + private static final int CHUNK_AXML_FILE = 0x00080003, CHUNK_AXML_FILE_BROKEN = 0x00080001, CHUNK_RESOURCEIDS = 0x00080180, CHUNK_XML_FIRST = 0x00100100, CHUNK_XML_START_NAMESPACE = 0x00100100, CHUNK_XML_END_NAMESPACE = 0x00100101, diff --git a/brut.j.util/src/main/java/brut/util/ExtDataInput.java b/brut.j.util/src/main/java/brut/util/ExtDataInput.java index 4048eec4..be380a28 100644 --- a/brut.j.util/src/main/java/brut/util/ExtDataInput.java +++ b/brut.j.util/src/main/java/brut/util/ExtDataInput.java @@ -42,11 +42,11 @@ public class ExtDataInput extends DataInputDelegate { skipBytes(4); } - public void skipCheckInt(int expected) throws IOException { + public void skipCheckInt(int expected1, int expected2) throws IOException { int got = readInt(); - if (got != expected) { + if (got != expected1 && got != expected2) { throw new IOException(String.format( - "Expected: 0x%08x, got: 0x%08x", expected, got)); + "Expected: 0x%08x or 0x%08x, got: 0x%08x", expected1, expected2, got)); } }