From f1742c1956aed64f2660172ab961303f26245025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ryszard=20Wi=C5=9Bniewski?= Date: Sat, 27 Mar 2010 22:24:05 +0100 Subject: [PATCH] ARSCDecoder: added support for config chunks of size other than 32. --- .../androlib/res/decoder/ARSCDecoder.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/brut/androlib/res/decoder/ARSCDecoder.java b/src/brut/androlib/res/decoder/ARSCDecoder.java index 1665e622..bbbe943b 100644 --- a/src/brut/androlib/res/decoder/ARSCDecoder.java +++ b/src/brut/androlib/res/decoder/ARSCDecoder.java @@ -25,6 +25,7 @@ import com.mindprod.ledatastream.LEDataInputStream; import java.io.*; import java.util.LinkedHashMap; import java.util.Map; +import java.util.logging.Logger; /** * @author Ryszard Wiśniewski @@ -182,7 +183,12 @@ public class ARSCDecoder { } private ResConfigFlags readConfigFlags() throws IOException, AndrolibException { - /*size*/ mIn.skipCheckInt(32); + int size = mIn.readInt(); + if (size < 28) { + throw new AndrolibException("Config size < 28"); + } else if (size > 32) { + LOGGER.warning("Config size > 32"); + } short mcc = mIn.readShort(); short mnc = mIn.readShort(); @@ -207,8 +213,15 @@ public class ARSCDecoder { short sdkVersion = mIn.readShort(); mIn.skipBytes(2); - byte screenLayout = mIn.readByte(); - mIn.skipBytes(3); + byte screenLayout = 0; + if (size >= 32) { + screenLayout = mIn.readByte(); + mIn.skipBytes(3); + } + + if (size > 32) { + mIn.skipBytes(size - 32); + } return new ResConfigFlags(mcc, mnc, language, country, orientation, touchscreen, density, keyboard, navigation, inputFlags, @@ -276,4 +289,7 @@ public class ARSCDecoder { TYPE_TYPE = 0x0202, TYPE_CONFIG = 0x0201; } + + private static final Logger LOGGER = + Logger.getLogger(ARSCDecoder.class.getName()); }