Skip to content

Commit 726e337

Browse files
melverebiederm
authored andcommitted
arm64: Add compile-time asserts for siginfo_t offsets
To help catch ABI breaks at compile-time, add compile-time assertions to verify the siginfo_t layout. Link: https://lkml.kernel.org/r/20210505141101.11519-3-ebiederm@xmission.com Link: https://lkml.kernel.org/r/20210429190734.624918-3-elver@google.com Link: https://lkml.kernel.org/r/87sg0fxx92.fsf_-_@disp2133 Signed-off-by: Marco Elver <elver@google.com> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
1 parent 56516a4 commit 726e337

2 files changed

Lines changed: 74 additions & 0 deletions

File tree

arch/arm64/kernel/signal.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -999,3 +999,40 @@ void __init minsigstksz_setup(void)
999999
round_up(sizeof(struct frame_record), 16) +
10001000
16; /* max alignment padding */
10011001
}
1002+
1003+
/*
1004+
* Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
1005+
* changes likely come with new fields that should be added below.
1006+
*/
1007+
static_assert(NSIGILL == 11);
1008+
static_assert(NSIGFPE == 15);
1009+
static_assert(NSIGSEGV == 9);
1010+
static_assert(NSIGBUS == 5);
1011+
static_assert(NSIGTRAP == 6);
1012+
static_assert(NSIGCHLD == 6);
1013+
static_assert(NSIGSYS == 2);
1014+
static_assert(offsetof(siginfo_t, si_signo) == 0x00);
1015+
static_assert(offsetof(siginfo_t, si_errno) == 0x04);
1016+
static_assert(offsetof(siginfo_t, si_code) == 0x08);
1017+
static_assert(offsetof(siginfo_t, si_pid) == 0x10);
1018+
static_assert(offsetof(siginfo_t, si_uid) == 0x14);
1019+
static_assert(offsetof(siginfo_t, si_tid) == 0x10);
1020+
static_assert(offsetof(siginfo_t, si_overrun) == 0x14);
1021+
static_assert(offsetof(siginfo_t, si_status) == 0x18);
1022+
static_assert(offsetof(siginfo_t, si_utime) == 0x20);
1023+
static_assert(offsetof(siginfo_t, si_stime) == 0x28);
1024+
static_assert(offsetof(siginfo_t, si_value) == 0x18);
1025+
static_assert(offsetof(siginfo_t, si_int) == 0x18);
1026+
static_assert(offsetof(siginfo_t, si_ptr) == 0x18);
1027+
static_assert(offsetof(siginfo_t, si_addr) == 0x10);
1028+
static_assert(offsetof(siginfo_t, si_addr_lsb) == 0x18);
1029+
static_assert(offsetof(siginfo_t, si_lower) == 0x20);
1030+
static_assert(offsetof(siginfo_t, si_upper) == 0x28);
1031+
static_assert(offsetof(siginfo_t, si_pkey) == 0x20);
1032+
static_assert(offsetof(siginfo_t, si_perf_data) == 0x18);
1033+
static_assert(offsetof(siginfo_t, si_perf_type) == 0x20);
1034+
static_assert(offsetof(siginfo_t, si_band) == 0x10);
1035+
static_assert(offsetof(siginfo_t, si_fd) == 0x18);
1036+
static_assert(offsetof(siginfo_t, si_call_addr) == 0x10);
1037+
static_assert(offsetof(siginfo_t, si_syscall) == 0x18);
1038+
static_assert(offsetof(siginfo_t, si_arch) == 0x1c);

arch/arm64/kernel/signal32.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,3 +457,40 @@ void compat_setup_restart_syscall(struct pt_regs *regs)
457457
{
458458
regs->regs[7] = __NR_compat_restart_syscall;
459459
}
460+
461+
/*
462+
* Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
463+
* changes likely come with new fields that should be added below.
464+
*/
465+
static_assert(NSIGILL == 11);
466+
static_assert(NSIGFPE == 15);
467+
static_assert(NSIGSEGV == 9);
468+
static_assert(NSIGBUS == 5);
469+
static_assert(NSIGTRAP == 6);
470+
static_assert(NSIGCHLD == 6);
471+
static_assert(NSIGSYS == 2);
472+
static_assert(offsetof(compat_siginfo_t, si_signo) == 0x00);
473+
static_assert(offsetof(compat_siginfo_t, si_errno) == 0x04);
474+
static_assert(offsetof(compat_siginfo_t, si_code) == 0x08);
475+
static_assert(offsetof(compat_siginfo_t, si_pid) == 0x0c);
476+
static_assert(offsetof(compat_siginfo_t, si_uid) == 0x10);
477+
static_assert(offsetof(compat_siginfo_t, si_tid) == 0x0c);
478+
static_assert(offsetof(compat_siginfo_t, si_overrun) == 0x10);
479+
static_assert(offsetof(compat_siginfo_t, si_status) == 0x14);
480+
static_assert(offsetof(compat_siginfo_t, si_utime) == 0x18);
481+
static_assert(offsetof(compat_siginfo_t, si_stime) == 0x1c);
482+
static_assert(offsetof(compat_siginfo_t, si_value) == 0x14);
483+
static_assert(offsetof(compat_siginfo_t, si_int) == 0x14);
484+
static_assert(offsetof(compat_siginfo_t, si_ptr) == 0x14);
485+
static_assert(offsetof(compat_siginfo_t, si_addr) == 0x0c);
486+
static_assert(offsetof(compat_siginfo_t, si_addr_lsb) == 0x10);
487+
static_assert(offsetof(compat_siginfo_t, si_lower) == 0x14);
488+
static_assert(offsetof(compat_siginfo_t, si_upper) == 0x18);
489+
static_assert(offsetof(compat_siginfo_t, si_pkey) == 0x14);
490+
static_assert(offsetof(compat_siginfo_t, si_perf_data) == 0x10);
491+
static_assert(offsetof(compat_siginfo_t, si_perf_type) == 0x14);
492+
static_assert(offsetof(compat_siginfo_t, si_band) == 0x0c);
493+
static_assert(offsetof(compat_siginfo_t, si_fd) == 0x10);
494+
static_assert(offsetof(compat_siginfo_t, si_call_addr) == 0x0c);
495+
static_assert(offsetof(compat_siginfo_t, si_syscall) == 0x10);
496+
static_assert(offsetof(compat_siginfo_t, si_arch) == 0x14);

0 commit comments

Comments
 (0)