]> Cypherpunks repositories - gostls13.git/commitdiff
archive/zip: preserve old FileHeader.ModTime behavior
authorJoe Tsai <joetsai@digital-static.net>
Wed, 15 Nov 2017 20:38:26 +0000 (12:38 -0800)
committerRuss Cox <rsc@golang.org>
Wed, 29 Nov 2017 16:28:13 +0000 (16:28 +0000)
In order to avoid a regression where the date of the ModTime method
changed behavior, simply preserve the old behavior of determining
the date based on the legacy fields.

This ensures that anyone relying on ModTime before Go1.10 will have
the exact same behavior as before.
New users should use FileHeader.Modified instead.

We keep the UTC coersion logic in SetModTime since some users
manually compute timezone offsets in order to have precise control
over the MS-DOS time field.

Fixes #22738

Change-Id: Ib18b6ebd863bcf645748e083357dce9bc788cdba
Reviewed-on: https://go-review.googlesource.com/78031
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/archive/zip/struct.go
src/archive/zip/writer.go

index 63fa0b3b4d063a2489d9d3d903dbbe17c0b67a9c..f613ebdc3444f3e71998769216ac52025d327291 100644 (file)
@@ -228,15 +228,11 @@ func timeToMsDosTime(t time.Time) (fDate uint16, fTime uint16) {
        return
 }
 
-// ModTime returns the modification time in UTC.
-// This returns Modified if non-zero, otherwise it computes the timestamp
-// from the legacy ModifiedDate and ModifiedTime fields.
+// ModTime returns the modification time in UTC using the legacy
+// ModifiedDate and ModifiedTime fields.
 //
 // Deprecated: Use Modified instead.
 func (h *FileHeader) ModTime() time.Time {
-       if !h.Modified.IsZero() {
-               return h.Modified.UTC() // Convert to UTC for compatibility
-       }
        return msDosTimeToTime(h.ModifiedDate, h.ModifiedTime)
 }
 
index bcab212d4054990c3e4ebfaabc8e08efd7f44606..14a5ee48c117a3af1a99ff75532a3ba160607837 100644 (file)
@@ -310,7 +310,7 @@ func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error) {
                // This format happens to be identical for both local and central header
                // if modification time is the only timestamp being encoded.
                var mbuf [9]byte // 2*SizeOf(uint16) + SizeOf(uint8) + SizeOf(uint32)
-               mt := uint32(fh.ModTime().Unix())
+               mt := uint32(fh.Modified.Unix())
                eb := writeBuf(mbuf[:])
                eb.uint16(extTimeExtraID)
                eb.uint16(5)  // Size: SizeOf(uint8) + SizeOf(uint32)