diff options
| author | cuiweixie <cuiweixie@gmail.com> | 2026-04-04 11:06:26 +0000 |
|---|---|---|
| committer | David Chase <drchase@google.com> | 2026-04-06 09:13:39 -0700 |
| commit | 3e5efa048ac647c7554eea3a4ed230f265841115 (patch) | |
| tree | 4732c3bfc6178accafbb8c84b4b1621631d7da88 | |
| parent | 7a1d131afbb1aee15b56d8dd2405f270bbc486c2 (diff) | |
| download | go-3e5efa048ac647c7554eea3a4ed230f265841115.tar.xz | |
time: wrong Sign Cast in Time.UnmarshalBinary (V2 Format)
Fixes #78528
Change-Id: I8979a310dbf94b9710d3e8428480cb49a7308294
GitHub-Last-Rev: 3d7f5ef1491f15923add6ef556e387eb8d49bf3b
GitHub-Pull-Request: golang/go#78518
Reviewed-on: https://go-review.googlesource.com/c/go/+/762480
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Jorropo <jorropo.pgm@gmail.com>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
| -rw-r--r-- | src/time/time.go | 2 | ||||
| -rw-r--r-- | src/time/time_test.go | 23 |
2 files changed, 24 insertions, 1 deletions
diff --git a/src/time/time.go b/src/time/time.go index c63910cd91..ca53848ae1 100644 --- a/src/time/time.go +++ b/src/time/time.go @@ -1552,7 +1552,7 @@ func (t *Time) UnmarshalBinary(data []byte) error { buf = buf[4:] offset := int(int16(buf[1])|int16(buf[0])<<8) * 60 if version == timeBinaryVersionV2 { - offset += int(buf[2]) + offset += int(int8(buf[2])) } *t = Time{} diff --git a/src/time/time_test.go b/src/time/time_test.go index a453ee043c..8ff3b70c84 100644 --- a/src/time/time_test.go +++ b/src/time/time_test.go @@ -1752,6 +1752,29 @@ func TestMarshalBinaryVersion2(t *testing.T) { } } +func TestMarshalBinaryVersion2Bugfix(t *testing.T) { + offsetSec := -5*3600 - 30*60 - 45 // -19845 + loc := FixedZone("LMT", offsetSec) + + t1 := Date(2024, 6, 15, 12, 0, 0, 0, loc) + b, err := t1.MarshalBinary() + if err != nil { + t.Errorf("Failed to Marshal, error = %v", err) + } + + t2 := Time{} + err = t2.UnmarshalBinary(b) + if err != nil { + t.Errorf("Failed to Unmarshal, error = %v", err) + } + + _, t1OriginOffset := t1.Zone() + _, t2OriginOffset := t2.Zone() + if t1OriginOffset != t2OriginOffset { + t.Errorf("The result offsetSec: %d after Unmarshal is not matched original offsetSec: %d", t2OriginOffset, t1OriginOffset) + } +} + func TestUnmarshalTextAllocations(t *testing.T) { in := []byte(testdataRFC3339UTC) // short enough to be stack allocated if allocs := testing.AllocsPerRun(100, func() { |
