aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorkhr@golang.org <khr@golang.org>2025-11-08 11:11:10 -0800
committerGopher Robot <gobot@golang.org>2025-11-10 08:07:42 -0800
commit5f4b5f1a196774e45bc50de0729973119eb7bf07 (patch)
tree9da08f7fa379c0d67b8b937144440fe2bdafa07c /src/runtime
parent0fe6c8e8c878c44d4466f07ddd0a5b2cd07650c7 (diff)
downloadgo-5f4b5f1a196774e45bc50de0729973119eb7bf07.tar.xz
runtime/msan: use different msan routine for copying
__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>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/msan/msan.go8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/runtime/msan/msan.go b/src/runtime/msan/msan.go
index 8d4471b816..7a30581de7 100644
--- a/src/runtime/msan/msan.go
+++ b/src/runtime/msan/msan.go
@@ -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"