summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Shammi Khattar <skhattar@codeaurora.org> 2016-04-06 15:33:03 -0700
committer Narayan Kamath <narayan@google.com> 2016-04-28 12:13:16 +0000
commit1ead474f61fb3fe7d77ccdd8e65037fb8c93ad6d (patch)
treea21478316f777b9fb134798a12c962a28dfd265a
parent4dd00e93f300a50097c1ec09ca291849830e98dc (diff)
ZipUtils: Fix wrong timestamps when getEntryInfo
"tm_mon" format should align with "ZipEntry::setModWhen" in aapt. "tm_isdst" should be initialized, or it will because random value and cause error in function mktime(). BUG:28021145 Change-Id: I1e8d5c14e5d7b875bf9cd940cb7f4c5b93a1bcd6
-rw-r--r--include/androidfw/ZipUtils.h8
-rw-r--r--libs/androidfw/tests/ZipUtils_test.cpp7
2 files changed, 13 insertions, 2 deletions
diff --git a/include/androidfw/ZipUtils.h b/include/androidfw/ZipUtils.h
index 094eaa8dd214..55575d774522 100644
--- a/include/androidfw/ZipUtils.h
+++ b/include/androidfw/ZipUtils.h
@@ -21,6 +21,7 @@
#define __LIBS_ZIPUTILS_H
#include <stdint.h>
+#include <string.h>
#include <stdio.h>
#include <time.h>
@@ -63,16 +64,21 @@ public:
/*
* Utility function to convert ZIP's time format to a timespec struct.
+ *
+ * NOTE: this method will clear all existing state from |timespec|.
*/
static inline void zipTimeToTimespec(uint32_t when, struct tm* timespec) {
const uint32_t date = when >> 16;
+
+ memset(timespec, 0, sizeof(struct tm));
timespec->tm_year = ((date >> 9) & 0x7F) + 80; // Zip is years since 1980
- timespec->tm_mon = (date >> 5) & 0x0F;
+ timespec->tm_mon = ((date >> 5) & 0x0F) - 1;
timespec->tm_mday = date & 0x1F;
timespec->tm_hour = (when >> 11) & 0x1F;
timespec->tm_min = (when >> 5) & 0x3F;
timespec->tm_sec = (when & 0x1F) << 1;
+ timespec->tm_isdst = -1;
}
private:
ZipUtils() {}
diff --git a/libs/androidfw/tests/ZipUtils_test.cpp b/libs/androidfw/tests/ZipUtils_test.cpp
index c6038b597f4e..7293843e066a 100644
--- a/libs/androidfw/tests/ZipUtils_test.cpp
+++ b/libs/androidfw/tests/ZipUtils_test.cpp
@@ -45,7 +45,7 @@ TEST_F(ZipUtilsTest, ZipTimeConvertSuccess) {
EXPECT_EQ(2011, t.tm_year + 1900)
<< "Year was improperly converted.";
- EXPECT_EQ(6, t.tm_mon)
+ EXPECT_EQ(5, t.tm_mon)
<< "Month was improperly converted.";
EXPECT_EQ(29, t.tm_mday)
@@ -59,6 +59,11 @@ TEST_F(ZipUtilsTest, ZipTimeConvertSuccess) {
EXPECT_EQ(40, t.tm_sec)
<< "Second was improperly converted.";
+
+ // We don't have enough information to determine timezone related info.
+ EXPECT_EQ(-1, t.tm_isdst);
+ EXPECT_EQ(0, t.tm_gmtoff);
+ EXPECT_EQ(nullptr, t.tm_zone);
}
}