]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/msan: use different msan routine for copying
authorkhr@golang.org <khr@golang.org>
Sat, 8 Nov 2025 19:11:10 +0000 (11:11 -0800)
committerGopher Robot <gobot@golang.org>
Mon, 10 Nov 2025 16:07:42 +0000 (08:07 -0800)
__msan_memmove records the fact that we're copying memory, and
actually does the copy. Use instead __msan_copy_shadow, which
records the fact that we're copying memory, but doesn't actually
do the copy itself.

We're doing the copy ourselves, so we don't need msan to do it also.

More importantly, msan doing the copy clobbers the target before
we issue the write barrier, which causes pointers to get lost.

Fixes #76138

Change-Id: I17aea739f9444de21fac2bbfd81e48534a39481d
Reviewed-on: https://go-review.googlesource.com/c/go/+/719020
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: t hepudds <thepudds1460@gmail.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@google.com>
Auto-Submit: Keith Randall <khr@golang.org>
Reviewed-by: Radu Berinde <radu@cockroachlabs.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/msan/msan.go

index 8d4471b816e7617e098b0d9c31fa13c96490aa44..7a30581de775a3ee9367b03cafee15006992b057 100644 (file)
@@ -13,8 +13,6 @@ package msan
 #include <stdint.h>
 #include <sanitizer/msan_interface.h>
 
-extern void __msan_memmove(void*, const void*, uintptr_t);
-
 void __msan_read_go(void *addr, uintptr_t sz) {
        __msan_check_mem_is_initialized(addr, sz);
 }
@@ -32,7 +30,11 @@ void __msan_free_go(void *addr, uintptr_t sz) {
 }
 
 void __msan_memmove_go(void *to, const void *from, uintptr_t sz) {
-       __msan_memmove(to, from, sz);
+       // Note: don't use msan_memmove, as it actually does
+       // the move. We do the move ourselves, so it isn't necessary.
+       // Also, it clobbers the target before we issue the write
+       // barrier, which causes pointers to get lost. See issue 76138.
+       __msan_copy_shadow(to, from, sz);
 }
 */
 import "C"