aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcuiweixie <cuiweixie@gmail.com>2026-04-04 11:06:26 +0000
committerDavid Chase <drchase@google.com>2026-04-06 09:13:39 -0700
commit3e5efa048ac647c7554eea3a4ed230f265841115 (patch)
tree4732c3bfc6178accafbb8c84b4b1621631d7da88
parent7a1d131afbb1aee15b56d8dd2405f270bbc486c2 (diff)
downloadgo-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.go2
-rw-r--r--src/time/time_test.go23
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() {