-
Notifications
You must be signed in to change notification settings - Fork 221
Description
Description
The following line causes a runtime panic on 32bit arm architectures.
go-spacemesh/p2p/server/msgserver.go
Line 249 in 2671a24
return atomic.AddUint64(&p.ReqID, 1) |
Cause
A well known requirement of atomic.AddUint64 is that the address must be 64 bit aligned on 32bit arm architectures. This was picked up by the go-staticcheck linter, see https://staticcheck.io/docs/checks#SA1027 and this issue is also described in this article https://go101.org/article/memory-layout.html in particular the section The Alignment Requirement for 64-bit Word Atomic Operations. In our case the ReqID field in MessageServer comes after the log.log field and so is not guaranteed to be 8 byte aligned. A proposal exist in golang for the addresses of 64-bit words to be always be 8-byte aligned but has not yet been implemented, see: golang/go#36606.
Proposed Solution
Move ReqID to the top of MessageServer to guarantee 8 byte alignment. Testing with this change fixes the issue for me.
Steps To Reproduce
- Follow the normal build instructions on a Raspberry Pi 4B or (other 32bit arm computer with armv7l architecture).
- Run
go-spacemesh --config <path to config.json>
with the config file found here: https://storage.googleapis.com/spacecraft-data/tweedlelite126-archive/config.json - Wait approx 20 seconds until a p2p SendRequest is made at which point the following panic occurs:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x12668]
goroutine 211 [running]:
runtime/internal/atomic.goXadd64(0x212a124, 0x1, 0x0, 0xca2790, 0x99a3d0)
/usr/lib/go-1.14/src/runtime/internal/atomic/atomic_arm.go:103 +0x1c
github.com/spacemeshos/go-spacemesh/p2p/server.(*MessageServer).newReqID(...)
/home/pi/go-spacemesh/p2p/server/msgserver.go:251
github.com/spacemeshos/go-spacemesh/p2p/server.(*MessageServer).SendRequest(0x212a120, 0x0, 0x2043a80, 0x3c, 0x40, 0xc99460, 0x20c5180, 0x210b0c0, 0xb1daec, 0x9c8200, ...)
/home/pi/go-spacemesh/p2p/server/msgserver.go:231 +0x3c
github.com/spacemeshos/go-spacemesh/p2p/discovery.(*protocol).Ping(0x23c93c0, 0xc99460, 0x20c5180, 0x20c5180, 0x257c9f0)
/home/pi/go-spacemesh/p2p/discovery/ping.go:91 +0x278
github.com/spacemeshos/go-spacemesh/p2p/discovery.pingThenGetAddresses(0xa477e0d0, 0x23c93c0, 0x237c240, 0x257cb40)
/home/pi/go-spacemesh/p2p/discovery/refresher.go:154 +0xbc
created by github.com/spacemeshos/go-spacemesh/p2p/discovery.(*refresher).requestAddresses
/home/pi/go-spacemesh/p2p/discovery/refresher.go:203 +0x3cc
Expected Behavior
No panic.
Environment
- OS: Ubuntu Server 20.10 on armv7l architecture (Raspberry Pi 4B)
Tested on node versions:
- v0.1.26+ce1d13ba5358d1d507dac817f0d385208cd65d13
- v0.0.0-unreleased+2671a2491609be5952149979e9983e3e5b68dbb2