diff options
| author | Josh Bleecher Snyder <josharian@gmail.com> | 2017-05-01 07:36:43 -0700 |
|---|---|---|
| committer | Josh Bleecher Snyder <josharian@gmail.com> | 2017-05-01 17:35:57 +0000 |
| commit | b666f2860b2735eb61fe5a03dd90c3af8eed1ec3 (patch) | |
| tree | 6c53eba66fbeb19cabc50a3b4c83c2fcd07b9e88 /src/runtime/hashmap.go | |
| parent | 00db0cbf8648ca5b856aa3bd0179d205e6626473 (diff) | |
| download | go-b666f2860b2735eb61fe5a03dd90c3af8eed1ec3.tar.xz | |
runtime: use 64 bit calculation in overLoadFactor
overLoadFactor used a uintptr for its calculations.
When the number of potential buckets was large,
perhaps due to a coding error or corrupt/malicious user input
leading to a very large map size hint,
this led to overflow on 32 bit systems.
This overflow resulted in an infinite loop.
Prevent it by always using a 64 bit calculation.
Updates #20195
Change-Id: Iaabc710773cd5da6754f43b913478cc5562d89a2
Reviewed-on: https://go-review.googlesource.com/42185
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/runtime/hashmap.go')
| -rw-r--r-- | src/runtime/hashmap.go | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/runtime/hashmap.go b/src/runtime/hashmap.go index 0c9505e655..c6c2fa5fdf 100644 --- a/src/runtime/hashmap.go +++ b/src/runtime/hashmap.go @@ -985,7 +985,7 @@ func hashGrow(t *maptype, h *hmap) { // overLoadFactor reports whether count items placed in 1<<B buckets is over loadFactor. func overLoadFactor(count int64, B uint8) bool { // TODO: rewrite to use integer math and comparison? - return count >= bucketCnt && float32(count) >= loadFactor*float32((uintptr(1)<<B)) + return count >= bucketCnt && float32(count) >= loadFactor*float32((uint64(1)<<B)) } // tooManyOverflowBuckets reports whether noverflow buckets is too many for a map with 1<<B buckets. |
