]> Cypherpunks repositories - gostls13.git/commitdiff
time: accept numbers larger than 2^32 in ParseDuration.
authorDavid Symonds <dsymonds@golang.org>
Sun, 14 Oct 2012 20:50:13 +0000 (07:50 +1100)
committerDavid Symonds <dsymonds@golang.org>
Sun, 14 Oct 2012 20:50:13 +0000 (07:50 +1100)
Fixes #3374.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/6683047

src/pkg/time/format.go
src/pkg/time/time_test.go

index 46f4fbc13b55f685e751bcb3103a11dd7195b421..aab4a4d6b6093db5a8ae2af829f5b4cd4acdce6f 100644 (file)
@@ -323,7 +323,8 @@ func atoi(s string) (x int, err error) {
                neg = true
                s = s[1:]
        }
-       x, rem, err := leadingInt(s)
+       q, rem, err := leadingInt(s)
+       x = int(q)
        if err != nil || rem != "" {
                return 0, atoiError
        }
@@ -954,18 +955,18 @@ func parseNanoseconds(value string, nbytes int) (ns int, rangeErrString string,
 var errLeadingInt = errors.New("time: bad [0-9]*") // never printed
 
 // leadingInt consumes the leading [0-9]* from s.
-func leadingInt(s string) (x int, rem string, err error) {
+func leadingInt(s string) (x int64, rem string, err error) {
        i := 0
        for ; i < len(s); i++ {
                c := s[i]
                if c < '0' || c > '9' {
                        break
                }
-               if x >= (1<<31-10)/10 {
+               if x >= (1<<63-10)/10 {
                        // overflow
                        return 0, "", errLeadingInt
                }
-               x = x*10 + int(c) - '0'
+               x = x*10 + int64(c) - '0'
        }
        return x, s[i:], nil
 }
@@ -1010,7 +1011,7 @@ func ParseDuration(s string) (Duration, error) {
        for s != "" {
                g := float64(0) // this element of the sequence
 
-               var x int
+               var x int64
                var err error
 
                // The next character must be [0-9.]
index 23bb6a55bc15e8a04f5928e6788dc67d66e94887..9888d0d9c190347d2d353dadbf8ad0fef2b87a4a 100644 (file)
@@ -999,6 +999,8 @@ var parseDurationTests = []struct {
        {"-2m3.4s", true, -(2*Minute + 3*Second + 400*Millisecond)},
        {"1h2m3s4ms5us6ns", true, 1*Hour + 2*Minute + 3*Second + 4*Millisecond + 5*Microsecond + 6*Nanosecond},
        {"39h9m14.425s", true, 39*Hour + 9*Minute + 14*Second + 425*Millisecond},
+       // large value
+       {"52763797000ns", true, 52763797000 * Nanosecond},
 
        // errors
        {"", false, 0},