From: Keith Randall Date: Sat, 5 Aug 2017 16:58:41 +0000 (-0700) Subject: runtime: mapassign_* should use typedmemmove to update keys X-Git-Tag: go1.9rc2~1^2 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=579120323fdf0c6939fa3e3c6c63b669b6437e31;p=gostls13.git 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 TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements Reviewed-by: Josh Bleecher Snyder Reviewed-by: Ian Lance Taylor --- 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