]> Cypherpunks repositories - gostls13.git/commitdiff
big: fix broken overflow test
authorRobert Griesemer <gri@golang.org>
Wed, 1 Jun 2011 23:28:17 +0000 (16:28 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 1 Jun 2011 23:28:17 +0000 (16:28 -0700)
- tested with GOARCH=386
- tested with GOARCH=amd64

R=iant
CC=golang-dev
https://golang.org/cl/4526100

src/pkg/big/nat.go

index 313e22cbb31163e7553e33b9aa18efea578a4e36..4f17e3690c0e53d88c48c7b30ab95c9dfabff4c3 100755 (executable)
@@ -681,21 +681,21 @@ func (z nat) scan(r io.RuneScanner, base int) (nat, int, os.Error) {
        z = z.make(0)
        bb := Word(1)
        dd := Word(0)
-       for {
+       for max := _M / b; ; {
                d := hexValue(ch)
                if d >= b {
                        r.UnreadRune() // ch does not belong to number anymore
                        break
                }
 
-               if tmp := bb * b; tmp < bb {
-                       // overflow
+               if bb <= max {
+                       bb *= b
+                       dd = dd*b + d
+               } else {
+                       // bb * b would overflow
                        z = z.mulAddWW(z, bb, dd)
                        bb = b
                        dd = d
-               } else {
-                       bb = tmp
-                       dd = dd*b + d
                }
 
                if ch, _, err = r.ReadRune(); err != nil {