SIGN IN SIGN UP

unix: align Ifreq so its union accessors cannot fault

Uint16, SetUint16, Uint32, SetUint32, Inet4Addr and SetInet4Addr cast the
ifreq union to uint16, uint32 or RawSockaddrInet4 and access it in place.
The generated ifreq declares that union as a byte array, so the type
guarantees only byte alignment and the compiler may put an Ifreq at any
address - as it does for the elements of a []Ifreq, which pack at the
struct's size with an alignment of one.

A misaligned access is merely slow on amd64 and arm64; on sparc64 it
faults, and TestIoctlIfreq died with SIGBUS.

Align the wrapper rather than changing the accessors. The union lies at
offset 16 within ifreq on every architecture, so aligning the wrapper
aligns the union, and all six accessors are covered instead of only the
four integer ones.

TestIfreqAlignment pins the invariant. Without the fix it fails on every
architecture, reporting an alignment of 1, so catching a regression does
not need sparc64 hardware.

Updates golang/go#55000

Change-Id: I70aca33419086de9eb68032e354e5f666cc20562
GitHub-Last-Rev: 637b50d0e63b84eb536019d7c893c5cb07289bf3
GitHub-Pull-Request: golang/sys#287
Reviewed-on: https://go-review.googlesource.com/c/sys/+/820000
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
S
Stian Halseth committed
f6989c5959ab33dcb983eaf490de10d83dbc810d
Parent: e8c1c32
Committed by Cherry Mui <cherryyz@google.com> on 8/25/2026, 2:23:08 PM