]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: add padding to Linux kernel structures
authorRhys Hiltner <rhys@justin.tv>
Thu, 30 Sep 2021 00:35:27 +0000 (17:35 -0700)
committerMichael Pratt <mpratt@google.com>
Mon, 4 Oct 2021 21:10:16 +0000 (21:10 +0000)
Go exchanges siginfo and sigevent structures with the kernel. They
contain unions, but Go's use is limited to the first few fields. Pad out
the rest so the size Go sees is the same as what the Linux kernel sees.

This is a follow-up to CL 342052 which added the sigevent struct without
padding. It updates the siginfo struct as well so there are no bad
examples in the defs_linux_*.go files.

Change-Id: Id991d4a57826677dd7e6cc30ad113fa3b321cddf
Reviewed-on: https://go-review.googlesource.com/c/go/+/353136
Run-TryBot: Rhys Hiltner <rhys@justin.tv>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
Trust: Michael Knyszek <mknyszek@google.com>

src/runtime/defs_linux_386.go
src/runtime/defs_linux_amd64.go
src/runtime/defs_linux_arm.go
src/runtime/defs_linux_arm64.go
src/runtime/defs_linux_mips64x.go
src/runtime/defs_linux_mipsx.go
src/runtime/defs_linux_ppc64.go
src/runtime/defs_linux_ppc64le.go
src/runtime/defs_linux_riscv64.go
src/runtime/defs_linux_s390x.go
src/runtime/os_linux.go

index d8b546cb4c7652a01f2e2a4011fcfc872e5169eb..fd9b60c444f4c409b6024f4084bf207d08b7a141 100644 (file)
@@ -3,6 +3,8 @@
 
 package runtime
 
+import "internal/goarch"
+
 const (
        _EINTR  = 0x4
        _EAGAIN = 0xb
@@ -172,6 +174,11 @@ type siginfo struct {
        si_code  int32
        // below here is a union; si_addr is the only field we use
        si_addr uint32
+
+       // Pad struct to the max size in the kernel. Account for the 3 32-bit
+       // fields, the alignment to this architecture's pointer size, and the final
+       // pointer-length field.
+       _ [_si_max_size - (3*4 + (1-4/goarch.PtrSize)*4 + 1*goarch.PtrSize)]byte
 }
 
 type stackt struct {
@@ -235,6 +242,10 @@ type sigevent struct {
        notify int32
        // below here is a union; sigev_notify_thread_id is the only field we use
        sigev_notify_thread_id int32
+
+       // Pad struct to the max size in the kernel. Account for the pointer-length
+       // field and the 3 32-bit fields.
+       _ [_sigev_max_size - (1*goarch.PtrSize + 3*4)]byte
 }
 
 type epollevent struct {
index 6afb67f77f474c5bf696b35506fa41da472b99b1..29dabe08dd27450711818aab6ee628cfe21a8fbd 100644 (file)
@@ -3,6 +3,8 @@
 
 package runtime
 
+import "internal/goarch"
+
 const (
        _EINTR  = 0x4
        _EAGAIN = 0xb
@@ -134,6 +136,11 @@ type siginfo struct {
        si_code  int32
        // below here is a union; si_addr is the only field we use
        si_addr uint64
+
+       // Pad struct to the max size in the kernel. Account for the 3 32-bit
+       // fields, the alignment to this architecture's pointer size, and the final
+       // pointer-length field.
+       _ [_si_max_size - (3*4 + (1-4/goarch.PtrSize)*4 + 1*goarch.PtrSize)]byte
 }
 
 type itimerspec struct {
@@ -152,6 +159,10 @@ type sigevent struct {
        notify int32
        // below here is a union; sigev_notify_thread_id is the only field we use
        sigev_notify_thread_id int32
+
+       // Pad struct to the max size in the kernel. Account for the pointer-length
+       // field and the 3 32-bit fields.
+       _ [_sigev_max_size - (1*goarch.PtrSize + 3*4)]byte
 }
 
 type epollevent struct {
index ec24d76326e2fb3944fbd7f9cf89e333bc13a3d8..3ed694064717b29e361a7649cb60de86fd57dde4 100644 (file)
@@ -4,6 +4,8 @@
 
 package runtime
 
+import "internal/goarch"
+
 // Constants
 const (
        _EINTR  = 0x4
@@ -175,6 +177,10 @@ type sigevent struct {
        notify int32
        // below here is a union; sigev_notify_thread_id is the only field we use
        sigev_notify_thread_id int32
+
+       // Pad struct to the max size in the kernel. Account for the pointer-length
+       // field and the 3 32-bit fields.
+       _ [_sigev_max_size - (1*goarch.PtrSize + 3*4)]byte
 }
 
 type siginfo struct {
@@ -183,6 +189,11 @@ type siginfo struct {
        si_code  int32
        // below here is a union; si_addr is the only field we use
        si_addr uint32
+
+       // Pad struct to the max size in the kernel. Account for the 3 32-bit
+       // fields, the alignment to this architecture's pointer size, and the final
+       // pointer-length field.
+       _ [_si_max_size - (3*4 + (1-4/goarch.PtrSize)*4 + 1*goarch.PtrSize)]byte
 }
 
 type sigactiont struct {
index f9f175004bc72adc6d03e9b8b728161c76ee441a..6a126c4a154512c10894547b0ed7a5ccbb12f805 100644 (file)
@@ -3,6 +3,8 @@
 
 package runtime
 
+import "internal/goarch"
+
 const (
        _EINTR  = 0x4
        _EAGAIN = 0xb
@@ -134,6 +136,11 @@ type siginfo struct {
        si_code  int32
        // below here is a union; si_addr is the only field we use
        si_addr uint64
+
+       // Pad struct to the max size in the kernel. Account for the 3 32-bit
+       // fields, the alignment to this architecture's pointer size, and the final
+       // pointer-length field.
+       _ [_si_max_size - (3*4 + (1-4/goarch.PtrSize)*4 + 1*goarch.PtrSize)]byte
 }
 
 type itimerspec struct {
@@ -152,6 +159,10 @@ type sigevent struct {
        notify int32
        // below here is a union; sigev_notify_thread_id is the only field we use
        sigev_notify_thread_id int32
+
+       // Pad struct to the max size in the kernel. Account for the pointer-length
+       // field and the 3 32-bit fields.
+       _ [_sigev_max_size - (1*goarch.PtrSize + 3*4)]byte
 }
 
 type epollevent struct {
index 1743bbce4192c4bc756e470007b60f57afd371e5..34e803331ceb3073378d8698a2be3ebc481dbac6 100644 (file)
@@ -8,6 +8,8 @@
 
 package runtime
 
+import "internal/goarch"
+
 const (
        _EINTR  = 0x4
        _EAGAIN = 0xb
@@ -143,6 +145,11 @@ type siginfo struct {
        __pad0   [1]int32
        // below here is a union; si_addr is the only field we use
        si_addr uint64
+
+       // Pad struct to the max size in the kernel. Account for the 3 32-bit
+       // fields, the alignment to this architecture's pointer size, and the final
+       // pointer-length field.
+       _ [_si_max_size - (3*4 + (1-4/goarch.PtrSize)*4 + 1*goarch.PtrSize)]byte
 }
 
 type itimerspec struct {
@@ -161,6 +168,10 @@ type sigevent struct {
        notify int32
        // below here is a union; sigev_notify_thread_id is the only field we use
        sigev_notify_thread_id int32
+
+       // Pad struct to the max size in the kernel. Account for the pointer-length
+       // field and the 3 32-bit fields.
+       _ [_sigev_max_size - (1*goarch.PtrSize + 3*4)]byte
 }
 
 type epollevent struct {
index e84d4979e1328c53a3934f0009cc5e10b5cf504d..7a7db7f18187ee7c52598aa73b5158c61651a322 100644 (file)
@@ -8,6 +8,8 @@
 
 package runtime
 
+import "internal/goarch"
+
 const (
        _EINTR  = 0x4
        _EAGAIN = 0xb
@@ -137,6 +139,11 @@ type siginfo struct {
        si_errno int32
        // below here is a union; si_addr is the only field we use
        si_addr uint32
+
+       // Pad struct to the max size in the kernel. Account for the 3 32-bit
+       // fields, the alignment to this architecture's pointer size, and the final
+       // pointer-length field.
+       _ [_si_max_size - (3*4 + (1-4/goarch.PtrSize)*4 + 1*goarch.PtrSize)]byte
 }
 
 type itimerspec struct {
@@ -155,6 +162,10 @@ type sigevent struct {
        notify int32
        // below here is a union; sigev_notify_thread_id is the only field we use
        sigev_notify_thread_id int32
+
+       // Pad struct to the max size in the kernel. Account for the pointer-length
+       // field and the 3 32-bit fields.
+       _ [_sigev_max_size - (1*goarch.PtrSize + 3*4)]byte
 }
 
 type epollevent struct {
index e0775e297434bc1302390567fc49387657c03f64..7971ca705892a4182dad28af8a94f3d0e98bb603 100644 (file)
@@ -3,6 +3,8 @@
 
 package runtime
 
+import "internal/goarch"
+
 const (
        _EINTR  = 0x4
        _EAGAIN = 0xb
@@ -135,6 +137,11 @@ type siginfo struct {
        si_code  int32
        // below here is a union; si_addr is the only field we use
        si_addr uint64
+
+       // Pad struct to the max size in the kernel. Account for the 3 32-bit
+       // fields, the alignment to this architecture's pointer size, and the final
+       // pointer-length field.
+       _ [_si_max_size - (3*4 + (1-4/goarch.PtrSize)*4 + 1*goarch.PtrSize)]byte
 }
 
 type itimerspec struct {
@@ -153,6 +160,10 @@ type sigevent struct {
        notify int32
        // below here is a union; sigev_notify_thread_id is the only field we use
        sigev_notify_thread_id int32
+
+       // Pad struct to the max size in the kernel. Account for the pointer-length
+       // field and the 3 32-bit fields.
+       _ [_sigev_max_size - (1*goarch.PtrSize + 3*4)]byte
 }
 
 type epollevent struct {
index e0775e297434bc1302390567fc49387657c03f64..7971ca705892a4182dad28af8a94f3d0e98bb603 100644 (file)
@@ -3,6 +3,8 @@
 
 package runtime
 
+import "internal/goarch"
+
 const (
        _EINTR  = 0x4
        _EAGAIN = 0xb
@@ -135,6 +137,11 @@ type siginfo struct {
        si_code  int32
        // below here is a union; si_addr is the only field we use
        si_addr uint64
+
+       // Pad struct to the max size in the kernel. Account for the 3 32-bit
+       // fields, the alignment to this architecture's pointer size, and the final
+       // pointer-length field.
+       _ [_si_max_size - (3*4 + (1-4/goarch.PtrSize)*4 + 1*goarch.PtrSize)]byte
 }
 
 type itimerspec struct {
@@ -153,6 +160,10 @@ type sigevent struct {
        notify int32
        // below here is a union; sigev_notify_thread_id is the only field we use
        sigev_notify_thread_id int32
+
+       // Pad struct to the max size in the kernel. Account for the pointer-length
+       // field and the 3 32-bit fields.
+       _ [_sigev_max_size - (1*goarch.PtrSize + 3*4)]byte
 }
 
 type epollevent struct {
index 1052213a4c768483205f6cab987a390e6e5e38e5..92f4563dd5247c3009a3ec80d81956187346a384 100644 (file)
@@ -4,6 +4,8 @@
 
 package runtime
 
+import "internal/goarch"
+
 const (
        _EINTR  = 0x4
        _EAGAIN = 0xb
@@ -132,6 +134,11 @@ type siginfo struct {
        si_code  int32
        // below here is a union; si_addr is the only field we use
        si_addr uint64
+
+       // Pad struct to the max size in the kernel. Account for the 3 32-bit
+       // fields, the alignment to this architecture's pointer size, and the final
+       // pointer-length field.
+       _ [_si_max_size - (3*4 + (1-4/goarch.PtrSize)*4 + 1*goarch.PtrSize)]byte
 }
 
 type itimerspec struct {
@@ -150,6 +157,10 @@ type sigevent struct {
        notify int32
        // below here is a union; sigev_notify_thread_id is the only field we use
        sigev_notify_thread_id int32
+
+       // Pad struct to the max size in the kernel. Account for the pointer-length
+       // field and the 3 32-bit fields.
+       _ [_sigev_max_size - (1*goarch.PtrSize + 3*4)]byte
 }
 
 type epollevent struct {
index b072955d4a3e2625ab08ae002d161f5fd0c41c38..8a56ef0b8052d70efb58465fe27194eb5f4a0c2b 100644 (file)
@@ -4,6 +4,8 @@
 
 package runtime
 
+import "internal/goarch"
+
 const (
        _EINTR  = 0x4
        _EAGAIN = 0xb
@@ -131,6 +133,11 @@ type siginfo struct {
        si_code  int32
        // below here is a union; si_addr is the only field we use
        si_addr uint64
+
+       // Pad struct to the max size in the kernel. Account for the 3 32-bit
+       // fields, the alignment to this architecture's pointer size, and the final
+       // pointer-length field.
+       _ [_si_max_size - (3*4 + (1-4/goarch.PtrSize)*4 + 1*goarch.PtrSize)]byte
 }
 
 type itimerspec struct {
@@ -149,6 +156,10 @@ type sigevent struct {
        notify int32
        // below here is a union; sigev_notify_thread_id is the only field we use
        sigev_notify_thread_id int32
+
+       // Pad struct to the max size in the kernel. Account for the pointer-length
+       // field and the 3 32-bit fields.
+       _ [_sigev_max_size - (1*goarch.PtrSize + 3*4)]byte
 }
 
 type epollevent struct {
index 06773c21939404f28abc7140dd055064402edbda..d5a5ff763bd0593867f1c760fd6b7eeba9620ee6 100644 (file)
@@ -440,6 +440,18 @@ func pipe() (r, w int32, errno int32)
 func pipe2(flags int32) (r, w int32, errno int32)
 func setNonblock(fd int32)
 
+const (
+       _si_max_size    = 128
+       _sigev_max_size = 64
+)
+
+// Assert that the Go definitions of structures exchanged with the kernel are
+// the same size as what the kernel defines.
+var (
+       _ [_si_max_size]struct{}    = [unsafe.Sizeof(siginfo{})]struct{}{}
+       _ [_sigev_max_size]struct{} = [unsafe.Sizeof(sigevent{})]struct{}{}
+)
+
 //go:nosplit
 //go:nowritebarrierrec
 func setsig(i uint32, fn uintptr) {