Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7134ce35 authored by Shammi Khattar's avatar Shammi Khattar Committed by Narayan Kamath
Browse files

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

(cherry picked from commit bb0eb3f4cb33c077b296a18555a9a1a966ff696b)

Change-Id: Ia39cf63fcd4bb39c24af080562960279106f526c
parent 5bddeaa9
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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() {}
+6 −1
Original line number Diff line number Diff line
@@ -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);
}

}