From b2975916224caecfc2fbb84e71ebd625ce6eeb1c Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Mon, 30 Jun 2014 15:59:39 +0100 Subject: Fix packing of values at offset 16. Our bitmask for setting the highest bit to 0 for 0b11100000 (0xef) instead of 0b01111111 (0x7f) so we would end up setting bit 5 of each offset to zero. Fix this and expand test coverage by adding a fake language (tgp) that has this bit set in both its bytes. This issue was discovered while adding CTS tests for "tgl". Change-Id: Ibb6de03000951c907c252049771039ab7466187a --- libs/androidfw/ResourceTypes.cpp | 6 +++--- libs/androidfw/tests/ResourceTypes_test.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 2c828c1ee040..2f3b1f720d03 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -1597,9 +1597,9 @@ void ResTable_config::copyFromDeviceNoSwap(const ResTable_config& o) { out[0] = in[0]; out[1] = in[1]; } else { - uint8_t first = (in[0] - base) & 0x00ef; - uint8_t second = (in[1] - base) & 0x00ef; - uint8_t third = (in[2] - base) & 0x00ef; + uint8_t first = (in[0] - base) & 0x007f; + uint8_t second = (in[1] - base) & 0x007f; + uint8_t third = (in[2] - base) & 0x007f; out[0] = (0x80 | (third << 2) | (second >> 3)); out[1] = ((second << 5) | first); diff --git a/libs/androidfw/tests/ResourceTypes_test.cpp b/libs/androidfw/tests/ResourceTypes_test.cpp index 4888b4a2ea7b..139f86833613 100644 --- a/libs/androidfw/tests/ResourceTypes_test.cpp +++ b/libs/androidfw/tests/ResourceTypes_test.cpp @@ -75,6 +75,30 @@ TEST(ResourceTypesTest, ResourceConfig_packAndUnpack3LetterLanguage) { EXPECT_EQ(0, out[3]); } +TEST(ResourceTypesTest, ResourceConfig_packAndUnpack3LetterLanguageAtOffset16) { + ResTable_config config; + config.packLanguage("tgp"); + + // We had a bug where we would accidentally mask + // the 5th bit of both bytes + // + // packed[0] = 1011 1100 + // packed[1] = 1101 0011 + // + // which is equivalent to: + // 1 [0] [1] [2] + // 1-01111-00110-10011 + EXPECT_EQ(0xbc, config.language[0]); + EXPECT_EQ(0xd3, config.language[1]); + + char out[4] = { 1, 1, 1, 1}; + config.unpackLanguage(out); + EXPECT_EQ('t', out[0]); + EXPECT_EQ('g', out[1]); + EXPECT_EQ('p', out[2]); + EXPECT_EQ(0, out[3]); +} + TEST(ResourceTypesTest, ResourceConfig_packAndUnpack3LetterRegion) { ResTable_config config; config.packRegion("419"); -- cgit v1.2.3-59-g8ed1b