TECH Signal 243 2 feeds carried it
Go runtime netpoll crashes on 32-bit systems from tagged pointer layout mismatch
A Go runtime bug causes intermittent fatal crashes on 32-bit ARM and i386 Linux systems because tagged and raw pointers are laid out differently in the epoll event data field, causing the netpoll mechanism to misidentify event sources.
Engineers running long-lived Go applications on 32-bit embedded Linux systems face unpredictable crashes that went unfixed since March 2025. The root cause is a subtle pointer-tagging collision in the runtime's netpoll code, making it nearly impossible to diagnose without deep knowledge of Go internals.
Written by elseif from the cluster below · every claim links back to a sourceThe three things worth knowing
The crash produces 'runtime: netpoll: eventfd ready for something unexpected' when epoll returns EPOLLIN|EPOLLOUT instead of the expected EPOLLIN alone.
On 32-bit platforms, Go packs tagged pointers with the tag in the lower 4 bytes and the address in the upper 4 bytes, while raw pointers store the address in the lower 4 bytes with zeros above.
The netpoll code mixes raw and tagged pointers in the same 8-byte ev.Data field, causing the runtime to misidentify whether an event belongs to an eventfd or a socket fd.
THE CLUSTER
↗