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

Commit 426bf3a1 authored by Tianjie's avatar Tianjie
Browse files

Handle the invalid timestamp in zipfile

The month field is one based in the zipfile modification time. And
it causes an overflow converting it to struct tm. Switch to type to
signed integer to suppress the sub-overflow.

Bug: 153882979
Test: parse the problematic zipfile
Change-Id: Iaf47bcc7f83d61b18c9e7a98bb6ab3936c9257e3
parent 0b708cba
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -48,9 +48,10 @@ struct ZipEntryCommon {
  // Modification time. The zipfile format specifies
  // that the first two little endian bytes contain the time
  // and the last two little endian bytes contain the date.
  // See `GetModificationTime`.
  // See `GetModificationTime`. Use signed integer to avoid the
  // sub-overflow.
  // TODO: should be overridden by extra time field, if present.
  uint32_t mod_time;
  int32_t mod_time;

  // Returns `mod_time` as a broken-down struct tm.
  struct tm GetModificationTime() const;
+1 −0
Original line number Diff line number Diff line
@@ -1570,6 +1570,7 @@ bool ZipArchive::InitializeCentralDirectory(off64_t cd_start_offset, size_t cd_s
  return true;
}

// This function returns the embedded timestamp as is; and doesn't perform validations.
tm ZipEntryCommon::GetModificationTime() const {
  tm t = {};