History

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

Linus Torvalds committed 8 years ago

Commit 86f84772 parents ce38061 f6a01543 files · +69 −4Browse files

Unified · Split

3 files
  1. arch/x86/kernel/signal_compat.c +65 −0
  2. include/linux/compat.h +2 −2
  3. include/uapi/asm-generic/siginfo.h +2 −2
arch/x86/kernel/signal_compat.c+65−0
@@ -43,6 +43,13 @@ static inline void signal_compat_build_tests(void) · 42 unmodified lines
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) · 14 unmodified lines
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+2−2
@@ -229,13 +229,13 @@ typedef struct compat_siginfo { · 228 unmodified lines
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+2−2
@@ -102,13 +102,13 @@ typedef struct siginfo { · 101 unmodified lines
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 };

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t