From 0d7190b41336d81d73a5e88047dd56d7cffef7bd Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Wed, 6 Sep 2023 21:32:07 +0000 Subject: [PATCH] [zip] Set all entry times before 1980 to 1980-01-01 Before this change, entry times before 1980 had the year changed to 1980 but the month/day/hour/minutes/seconds were all kept as-is. Bug: 277978832 Test: atest zipalign_tests Change-Id: I9f87e98a6b985002578490b87c654fee86c65d62 --- tools/zipalign/ZipEntry.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/tools/zipalign/ZipEntry.cpp b/tools/zipalign/ZipEntry.cpp index dd2eac60a8..0355e56238 100644 --- a/tools/zipalign/ZipEntry.cpp +++ b/tools/zipalign/ZipEntry.cpp @@ -363,13 +363,22 @@ void ZipEntry::setModWhen(time_t when) struct tm tmResult; struct tm* ptm = localtime_r(&even, &tmResult); - int year; - year = ptm->tm_year; - if (year < 80) - year = 80; + // The earliest valid time for ZIP file entries is 1980-01-01. See: + // https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html. + // Set any time before 1980 to 1980-01-01. + if (ptm->tm_year < 80) { + ptm->tm_year = 80; + ptm->tm_mon = 0; + ptm->tm_mday = 1; + ptm->tm_hour = 0; + ptm->tm_min = 0; + ptm->tm_sec = 0; + } - uint16_t zdate = (year - 80) << 9 | (ptm->tm_mon+1) << 5 | ptm->tm_mday; - uint16_t ztime = ptm->tm_hour << 11 | ptm->tm_min << 5 | ptm->tm_sec >> 1; + uint16_t zdate = static_cast( + (ptm->tm_year - 80) << 9 | (ptm->tm_mon + 1) << 5 | ptm->tm_mday); + uint16_t ztime = static_cast( + ptm->tm_hour << 11 | ptm->tm_min << 5 | ptm->tm_sec >> 1); mCDE.mLastModFileTime = mLFH.mLastModFileTime = ztime; mCDE.mLastModFileDate = mLFH.mLastModFileDate = zdate;