Skip to content

Commit 86f8477

Browse files
committed
Merge branch 'siginfo-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
Pull sigingo fix from Eric Biederman: "The kbuild test robot found that I accidentally moved si_pkey when I was cleaning up siginfo_t. A short followed by an int with the int having 8 byte alignment. Sheesh siginfo_t is a weird structure. I have now corrected it and added build time checks that with a little luck will catch any similar future mistakes. The build time checks were sufficient for me to verify the bug and to verify my fix. So they are at least useful this once." * 'siginfo-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace: signal/x86: Include the field offsets in the build time checks signal: Correct the offset of si_pkey in struct siginfo
2 parents ce38061 + f6a0154 commit 86f8477

File tree

3 files changed

+69
-4
lines changed

3 files changed

+69
-4
lines changed

arch/x86/kernel/signal_compat.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ static inline void signal_compat_build_tests(void)
4343
BUILD_BUG_ON(offsetof(compat_siginfo_t, _sifields) != 3 * sizeof(int));
4444
#define CHECK_CSI_OFFSET(name) BUILD_BUG_ON(_sifields_offset != offsetof(compat_siginfo_t, _sifields.name))
4545

46+
BUILD_BUG_ON(offsetof(siginfo_t, si_signo) != 0);
47+
BUILD_BUG_ON(offsetof(siginfo_t, si_errno) != 4);
48+
BUILD_BUG_ON(offsetof(siginfo_t, si_code) != 8);
49+
50+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_signo) != 0);
51+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_errno) != 4);
52+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_code) != 8);
4653
/*
4754
* Ensure that the size of each si_field never changes.
4855
* If it does, it is a sign that the
@@ -63,36 +70,94 @@ static inline void signal_compat_build_tests(void)
6370
CHECK_CSI_SIZE (_kill, 2*sizeof(int));
6471
CHECK_SI_SIZE (_kill, 2*sizeof(int));
6572

73+
BUILD_BUG_ON(offsetof(siginfo_t, si_pid) != 0x10);
74+
BUILD_BUG_ON(offsetof(siginfo_t, si_uid) != 0x14);
75+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_pid) != 0xC);
76+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_uid) != 0x10);
77+
6678
CHECK_CSI_OFFSET(_timer);
6779
CHECK_CSI_SIZE (_timer, 3*sizeof(int));
6880
CHECK_SI_SIZE (_timer, 6*sizeof(int));
6981

82+
BUILD_BUG_ON(offsetof(siginfo_t, si_tid) != 0x10);
83+
BUILD_BUG_ON(offsetof(siginfo_t, si_overrun) != 0x14);
84+
BUILD_BUG_ON(offsetof(siginfo_t, si_value) != 0x18);
85+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_tid) != 0x0C);
86+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_overrun) != 0x10);
87+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_value) != 0x14);
88+
7089
CHECK_CSI_OFFSET(_rt);
7190
CHECK_CSI_SIZE (_rt, 3*sizeof(int));
7291
CHECK_SI_SIZE (_rt, 4*sizeof(int));
7392

93+
BUILD_BUG_ON(offsetof(siginfo_t, si_pid) != 0x10);
94+
BUILD_BUG_ON(offsetof(siginfo_t, si_uid) != 0x14);
95+
BUILD_BUG_ON(offsetof(siginfo_t, si_value) != 0x18);
96+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_pid) != 0x0C);
97+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_uid) != 0x10);
98+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_value) != 0x14);
99+
74100
CHECK_CSI_OFFSET(_sigchld);
75101
CHECK_CSI_SIZE (_sigchld, 5*sizeof(int));
76102
CHECK_SI_SIZE (_sigchld, 8*sizeof(int));
77103

104+
BUILD_BUG_ON(offsetof(siginfo_t, si_pid) != 0x10);
105+
BUILD_BUG_ON(offsetof(siginfo_t, si_uid) != 0x14);
106+
BUILD_BUG_ON(offsetof(siginfo_t, si_status) != 0x18);
107+
BUILD_BUG_ON(offsetof(siginfo_t, si_utime) != 0x20);
108+
BUILD_BUG_ON(offsetof(siginfo_t, si_stime) != 0x28);
109+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_pid) != 0x0C);
110+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_uid) != 0x10);
111+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_status) != 0x14);
112+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_utime) != 0x18);
113+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_stime) != 0x1C);
114+
78115
#ifdef CONFIG_X86_X32_ABI
79116
CHECK_CSI_OFFSET(_sigchld_x32);
80117
CHECK_CSI_SIZE (_sigchld_x32, 7*sizeof(int));
81118
/* no _sigchld_x32 in the generic siginfo_t */
119+
BUILD_BUG_ON(offsetof(compat_siginfo_t, _sifields._sigchld_x32._utime) != 0x18);
120+
BUILD_BUG_ON(offsetof(compat_siginfo_t, _sifields._sigchld_x32._stime) != 0x20);
82121
#endif
83122

84123
CHECK_CSI_OFFSET(_sigfault);
85124
CHECK_CSI_SIZE (_sigfault, 4*sizeof(int));
86125
CHECK_SI_SIZE (_sigfault, 8*sizeof(int));
87126

127+
BUILD_BUG_ON(offsetof(siginfo_t, si_addr) != 0x10);
128+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_addr) != 0x0C);
129+
130+
BUILD_BUG_ON(offsetof(siginfo_t, si_addr_lsb) != 0x18);
131+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_addr_lsb) != 0x10);
132+
133+
BUILD_BUG_ON(offsetof(siginfo_t, si_lower) != 0x20);
134+
BUILD_BUG_ON(offsetof(siginfo_t, si_upper) != 0x28);
135+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_lower) != 0x14);
136+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_upper) != 0x18);
137+
138+
BUILD_BUG_ON(offsetof(siginfo_t, si_pkey) != 0x20);
139+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_pkey) != 0x14);
140+
88141
CHECK_CSI_OFFSET(_sigpoll);
89142
CHECK_CSI_SIZE (_sigpoll, 2*sizeof(int));
90143
CHECK_SI_SIZE (_sigpoll, 4*sizeof(int));
91144

145+
BUILD_BUG_ON(offsetof(siginfo_t, si_band) != 0x10);
146+
BUILD_BUG_ON(offsetof(siginfo_t, si_fd) != 0x18);
147+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_band) != 0x0C);
148+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_fd) != 0x10);
149+
92150
CHECK_CSI_OFFSET(_sigsys);
93151
CHECK_CSI_SIZE (_sigsys, 3*sizeof(int));
94152
CHECK_SI_SIZE (_sigsys, 4*sizeof(int));
95153

154+
BUILD_BUG_ON(offsetof(siginfo_t, si_call_addr) != 0x10);
155+
BUILD_BUG_ON(offsetof(siginfo_t, si_syscall) != 0x18);
156+
BUILD_BUG_ON(offsetof(siginfo_t, si_arch) != 0x1C);
157+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_call_addr) != 0x0C);
158+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_syscall) != 0x10);
159+
BUILD_BUG_ON(offsetof(compat_siginfo_t, si_arch) != 0x14);
160+
96161
/* any new si_fields should be added here */
97162
}
98163

include/linux/compat.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,13 +229,13 @@ typedef struct compat_siginfo {
229229
short int _addr_lsb; /* Valid LSB of the reported address. */
230230
/* used when si_code=SEGV_BNDERR */
231231
struct {
232-
short _dummy_bnd;
232+
compat_uptr_t _dummy_bnd;
233233
compat_uptr_t _lower;
234234
compat_uptr_t _upper;
235235
} _addr_bnd;
236236
/* used when si_code=SEGV_PKUERR */
237237
struct {
238-
short _dummy_pkey;
238+
compat_uptr_t _dummy_pkey;
239239
u32 _pkey;
240240
} _addr_pkey;
241241
};

include/uapi/asm-generic/siginfo.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,13 @@ typedef struct siginfo {
102102
short _addr_lsb; /* LSB of the reported address */
103103
/* used when si_code=SEGV_BNDERR */
104104
struct {
105-
short _dummy_bnd;
105+
void *_dummy_bnd;
106106
void __user *_lower;
107107
void __user *_upper;
108108
} _addr_bnd;
109109
/* used when si_code=SEGV_PKUERR */
110110
struct {
111-
short _dummy_pkey;
111+
void *_dummy_pkey;
112112
__u32 _pkey;
113113
} _addr_pkey;
114114
};

0 commit comments

Comments
 (0)