]> Cypherpunks repositories - gostls13.git/commitdiff
internal/runtime/atomic: fix uintptr usage in arm And8/Or8
authorMauri de Souza Meneguzzo <mauri870@gmail.com>
Thu, 31 Oct 2024 10:48:14 +0000 (10:48 +0000)
committerGopher Robot <gobot@golang.org>
Thu, 31 Oct 2024 16:57:53 +0000 (16:57 +0000)
In CL 622075, I introduced code that violated unsafe.Pointer rules
by casting to uintptr and back across statements. This change corrects it.

Change-Id: Ib6f6c08d9ce33aaeaf41f390c7e9f13a7b8cb974
GitHub-Last-Rev: 01cc68a87c8c0ad068c71a911013421f28a8b4ef
GitHub-Pull-Request: golang/go#70129
Cq-Include-Trybots: luci.golang.try:gotip-linux-arm
Reviewed-on: https://go-review.googlesource.com/c/go/+/623755
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Michael Pratt <mpratt@google.com>

src/internal/runtime/atomic/atomic_arm.go

index dcc6ad99d6dea60498d3b46da5f2ceba0e943145..8d8ffcf7dcbf64f20aa6844ab8e5b13193bff7f9 100644 (file)
@@ -186,9 +186,8 @@ func Or8(addr *uint8, v uint8)
 //go:nosplit
 func goOr8(addr *uint8, v uint8) {
        // Align down to 4 bytes and use 32-bit CAS.
-       uaddr := uintptr(unsafe.Pointer(addr))
-       addr32 := (*uint32)(unsafe.Pointer(uaddr &^ 3))
-       word := uint32(v) << ((uaddr & 3) * 8) // little endian
+       addr32 := (*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(addr)) &^ 3))
+       word := uint32(v) << ((uintptr(unsafe.Pointer(addr)) & 3) * 8) // little endian
        for {
                old := *addr32
                if Cas(addr32, old, old|word) {
@@ -203,10 +202,9 @@ func And8(addr *uint8, v uint8)
 //go:nosplit
 func goAnd8(addr *uint8, v uint8) {
        // Align down to 4 bytes and use 32-bit CAS.
-       uaddr := uintptr(unsafe.Pointer(addr))
-       addr32 := (*uint32)(unsafe.Pointer(uaddr &^ 3))
-       word := uint32(v) << ((uaddr & 3) * 8)    // little endian
-       mask := uint32(0xFF) << ((uaddr & 3) * 8) // little endian
+       addr32 := (*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(addr)) &^ 3))
+       word := uint32(v) << ((uintptr(unsafe.Pointer(addr)) & 3) * 8)    // little endian
+       mask := uint32(0xFF) << ((uintptr(unsafe.Pointer(addr)) & 3) * 8) // little endian
        word |= ^mask
        for {
                old := *addr32