aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2017-08-05 09:58:41 -0700
committerKeith Randall <khr@golang.org>2017-08-07 06:24:42 +0000
commit579120323fdf0c6939fa3e3c6c63b669b6437e31 (patch)
tree0c3db3ff24ad5a0b45c5e34e0747eefd3d09ebec
parent380525598ca917fe3226842f91695f4851b34e89 (diff)
downloadgo-579120323fdf0c6939fa3e3c6c63b669b6437e31.tar.gz
go-579120323fdf0c6939fa3e3c6c63b669b6437e31.zip
runtime: mapassign_* should use typedmemmove to update keys
We need to make sure that when the key contains a pointer, we use a write barrier to update the key. Also mapdelete_* should use typedmemclr. Fixes #21297 Change-Id: I63dc90bec1cb909c2c6e08676c9ec853d736cdf8 Reviewed-on: https://go-review.googlesource.com/53414 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r--src/runtime/hashmap_fast.go8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/runtime/hashmap_fast.go b/src/runtime/hashmap_fast.go
index 1f9b313219..67b9787909 100644
--- a/src/runtime/hashmap_fast.go
+++ b/src/runtime/hashmap_fast.go
@@ -495,7 +495,7 @@ again:
}
// store new key/value at insert position
- *((*uint32)(insertk)) = key
+ typedmemmove(t.key, insertk, unsafe.Pointer(&key))
*inserti = top
h.count++
@@ -583,7 +583,7 @@ again:
}
// store new key/value at insert position
- *((*uint64)(insertk)) = key
+ typedmemmove(t.key, insertk, unsafe.Pointer(&key))
*inserti = top
h.count++
@@ -723,7 +723,7 @@ func mapdelete_fast32(t *maptype, h *hmap, key uint32) {
if key != *k {
continue
}
- *k = 0
+ typedmemclr(t.key, unsafe.Pointer(k))
v := unsafe.Pointer(uintptr(unsafe.Pointer(b)) + dataOffset + bucketCnt*4 + i*uintptr(t.valuesize))
typedmemclr(t.elem, v)
b.tophash[i] = empty
@@ -778,7 +778,7 @@ func mapdelete_fast64(t *maptype, h *hmap, key uint64) {
if key != *k {
continue
}
- *k = 0
+ typedmemclr(t.key, unsafe.Pointer(k))
v := unsafe.Pointer(uintptr(unsafe.Pointer(b)) + dataOffset + bucketCnt*8 + i*uintptr(t.valuesize))
typedmemclr(t.elem, v)
b.tophash[i] = empty