]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: don't panic for bad size hint in hashmap
authorFilip Gruszczynski <gruszczy@gmail.com>
Sat, 15 Apr 2017 22:17:29 +0000 (15:17 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 2 May 2017 20:51:39 +0000 (20:51 +0000)
Because the hint parameter is supposed to be treated
purely as a hint, if it doesn't meet the requirements
we disregard it and continue as if there was no hint
at all.

Fixes #19926

Change-Id: I86e7f99472fad6b99ba4e2fd33e4a9e55d55115e
Reviewed-on: https://go-review.googlesource.com/40854
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/runtime/hashmap.go
src/runtime/map_test.go
test/fixedbugs/bug273.go

index c6c2fa5fdf64fb9f41962a073076d50bc6e8532a..11ce0cbc4b831daf808f50b1c78699a2fd0d00cd 100644 (file)
@@ -255,9 +255,8 @@ func makemap(t *maptype, hint int64, h *hmap, bucket unsafe.Pointer) *hmap {
                throw("bad hmap size")
        }
 
-       if hint < 0 || int64(int32(hint)) != hint {
-               panic(plainError("makemap: size out of range"))
-               // TODO: make hint an int, then none of this nonsense
+       if hint < 0 || hint > int64(maxSliceCap(t.bucket.size)) {
+               hint = 0
        }
 
        if !ismapkey(t.key) {
index 45d14126c2e0645d8cafe0d78d94365f0ed4eeba..81f05a0613ec69645f4e773835aebc4022b516e6 100644 (file)
@@ -588,6 +588,14 @@ func TestMapLargeValNoPointer(t *testing.T) {
        }
 }
 
+// Test that making a map with a large or invalid hint
+// doesn't panic. (Issue 19926).
+func TestIgnoreBogusMapHint(t *testing.T) {
+       for _, hint := range []int64{-1, 1 << 62} {
+               _ = make(map[int]int, hint)
+       }
+}
+
 func benchmarkMapPop(b *testing.B, n int) {
        m := map[int]int{}
        for i := 0; i < b.N; i++ {
index b6258d54fc7d172f4f2e9f351724bb3bfcd9720b..c04f2116c5fecb418f6cec87308090c448e5f28f 100644 (file)
@@ -48,15 +48,6 @@ func bigcap() {
        g1 = make([]block, 10, big)
 }
 
-var g3 map[block]block
-func badmapcap() {
-       g3 = make(map[block]block, minus1)
-}
-
-func bigmapcap() {
-       g3 = make(map[block]block, big)
-}
-
 type cblock [1<<16-1]byte
 
 var g4 chan cblock
@@ -78,8 +69,6 @@ func main() {
        shouldfail(badcap, "badcap")
        shouldfail(badcap1, "badcap1")
        shouldfail(bigcap, "bigcap")
-       shouldfail(badmapcap, "badmapcap")
-       shouldfail(bigmapcap, "bigmapcap")
        shouldfail(badchancap, "badchancap")
        shouldfail(bigchancap, "bigchancap")
        shouldfail(overflowchan, "overflowchan")