aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Gerrand <adg@golang.org>2013-11-01 11:13:30 +1100
committerRuss Cox <rsc@golang.org>2013-11-01 11:13:30 +1100
commit194b6a4bf24c77db10b6c150eb9e695032c72b34 (patch)
treee6bdd0f6a22be6d172763b23ccea117562575093
parentf17adc07650a3af1e10cf081764d8c761320e30a (diff)
downloadgo-194b6a4bf24c77db10b6c150eb9e695032c72b34.tar.gz
go-194b6a4bf24c77db10b6c150eb9e695032c72b34.zip
[release-branch.go1.2] time: fix ParseDuration overflow when given more than 9 digits on 32-bit arch
««« CL 15080043 / fbf3b853e00b time: fix ParseDuration overflow when given more than 9 digits on 32-bit arch Fixes #6617. R=golang-dev, rsc, r CC=golang-dev https://golang.org/cl/15080043 »»» R=golang-dev CC=golang-dev https://golang.org/cl/20050045
-rw-r--r--src/pkg/time/format.go4
-rw-r--r--src/pkg/time/time_test.go2
2 files changed, 4 insertions, 2 deletions
diff --git a/src/pkg/time/format.go b/src/pkg/time/format.go
index 0595640219..6f92c12626 100644
--- a/src/pkg/time/format.go
+++ b/src/pkg/time/format.go
@@ -1204,11 +1204,11 @@ func ParseDuration(s string) (Duration, error) {
if err != nil {
return 0, errors.New("time: invalid duration " + orig)
}
- scale := 1
+ scale := 1.0
for n := pl - len(s); n > 0; n-- {
scale *= 10
}
- g += float64(x) / float64(scale)
+ g += float64(x) / scale
post = pl != len(s)
}
if !pre && !post {
diff --git a/src/pkg/time/time_test.go b/src/pkg/time/time_test.go
index 0619f88f09..22b751c525 100644
--- a/src/pkg/time/time_test.go
+++ b/src/pkg/time/time_test.go
@@ -1318,6 +1318,8 @@ var parseDurationTests = []struct {
{"39h9m14.425s", true, 39*Hour + 9*Minute + 14*Second + 425*Millisecond},
// large value
{"52763797000ns", true, 52763797000 * Nanosecond},
+ // more than 9 digits after decimal point, see http://golang.org/issue/6617
+ {"0.3333333333333333333h", true, 20 * Minute},
// errors
{"", false, 0},