]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix 32 bit build.
authorKeith Randall <khr@golang.org>
Thu, 31 Jul 2014 20:07:16 +0000 (13:07 -0700)
committerKeith Randall <khr@golang.org>
Thu, 31 Jul 2014 20:07:16 +0000 (13:07 -0700)
int(maxMem) is negative on 32 bits.  Need to use
unsigned arithmetic.

TBR=bradfitz
CC=golang-codereviews
https://golang.org/cl/121000045

src/pkg/runtime/slice.go

index 6ed70680f3abf9e014637802ed8504f4ff58d1b1..5349855ca43cab53bab2a3d9b9418f4bd2d152d0 100644 (file)
@@ -22,11 +22,11 @@ func makeslice(t *slicetype, len64 int64, cap64 int64) sliceStruct {
        // but since the cap is only being supplied implicitly, saying len is clearer.
        // See issue 4085.
        len := int(len64)
-       if len64 < 0 || int64(len) != len64 || t.elem.size > 0 && len > int(maxMem/uintptr(t.elem.size)) {
+       if len64 < 0 || int64(len) != len64 || t.elem.size > 0 && uintptr(len) > maxMem/uintptr(t.elem.size) {
                panic(errorString("makeslice: len out of range"))
        }
        cap := int(cap64)
-       if cap < len || int64(cap) != cap64 || t.elem.size > 0 && cap > int(maxMem/uintptr(t.elem.size)) {
+       if cap < len || int64(cap) != cap64 || t.elem.size > 0 && uintptr(cap) > maxMem/uintptr(t.elem.size) {
                panic(errorString("makeslice: cap out of range"))
        }
        p := newarray(t.elem, uintptr(cap))
@@ -42,7 +42,7 @@ func growslice(t *slicetype, old sliceStruct, n int64) sliceStruct {
        cap64 := int64(old.cap) + n
        cap := int(cap64)
 
-       if int64(cap) != cap64 || cap < old.cap || t.elem.size > 0 && cap > int(maxMem/uintptr(t.elem.size)) {
+       if int64(cap) != cap64 || cap < old.cap || t.elem.size > 0 && uintptr(cap) > maxMem/uintptr(t.elem.size) {
                panic(errorString("growslice: cap out of range"))
        }
 
@@ -74,7 +74,7 @@ func growslice(t *slicetype, old sliceStruct, n int64) sliceStruct {
                }
        }
 
-       if newcap >= int(maxMem/uintptr(et.size)) {
+       if uintptr(newcap) >= maxMem/uintptr(et.size) {
                panic(errorString("growslice: cap out of range"))
        }
        lenmem := uintptr(old.len) * uintptr(et.size)