@@ -154,13 +154,11 @@ COMPAT_SYSCALL_DEFINE0(rt_sigreturn)
154
154
155
155
#define get_user_seg (seg ) ({ unsigned int v; savesegment(seg, v); v; })
156
156
157
- static int ia32_setup_sigcontext (struct sigcontext_32 __user * sc ,
158
- void __user * fpstate ,
159
- struct pt_regs * regs , unsigned int mask )
157
+ static __always_inline int
158
+ __unsafe_setup_sigcontext32 (struct sigcontext_32 __user * sc ,
159
+ void __user * fpstate ,
160
+ struct pt_regs * regs , unsigned int mask )
160
161
{
161
- if (!user_access_begin (sc , sizeof (struct sigcontext_32 )))
162
- return - EFAULT ;
163
-
164
162
unsafe_put_user (get_user_seg (gs ), (unsigned int __user * )& sc -> gs , Efault );
165
163
unsafe_put_user (get_user_seg (fs ), (unsigned int __user * )& sc -> fs , Efault );
166
164
unsafe_put_user (get_user_seg (ds ), (unsigned int __user * )& sc -> ds , Efault );
@@ -187,13 +185,18 @@ static int ia32_setup_sigcontext(struct sigcontext_32 __user *sc,
187
185
/* non-iBCS2 extensions.. */
188
186
unsafe_put_user (mask , & sc -> oldmask , Efault );
189
187
unsafe_put_user (current -> thread .cr2 , & sc -> cr2 , Efault );
190
- user_access_end ();
191
188
return 0 ;
189
+
192
190
Efault :
193
- user_access_end ();
194
191
return - EFAULT ;
195
192
}
196
193
194
+ #define unsafe_put_sigcontext32 (sc , fp , regs , set , label ) \
195
+ do { \
196
+ if (__unsafe_setup_sigcontext32(sc, fp, regs, set->sig[0])) \
197
+ goto label; \
198
+ } while(0)
199
+
197
200
/*
198
201
* Determine which stack to use..
199
202
*/
@@ -234,7 +237,7 @@ int ia32_setup_frame(int sig, struct ksignal *ksig,
234
237
struct sigframe_ia32 __user * frame ;
235
238
void __user * restorer ;
236
239
int err = 0 ;
237
- void __user * fpstate = NULL ;
240
+ void __user * fp = NULL ;
238
241
239
242
/* copy_to_user optimizes that into a single 8 byte store */
240
243
static const struct {
@@ -247,17 +250,20 @@ int ia32_setup_frame(int sig, struct ksignal *ksig,
247
250
0x80cd , /* int $0x80 */
248
251
};
249
252
250
- frame = get_sigframe (ksig , regs , sizeof (* frame ), & fpstate );
253
+ frame = get_sigframe (ksig , regs , sizeof (* frame ), & fp );
251
254
252
255
if (!access_ok (frame , sizeof (* frame )))
253
256
return - EFAULT ;
254
257
255
258
if (__put_user (sig , & frame -> sig ))
256
259
return - EFAULT ;
257
260
258
- if (ia32_setup_sigcontext (& frame -> sc , fpstate , regs , set -> sig [ 0 ] ))
261
+ if (! user_access_begin (& frame -> sc , sizeof ( struct sigcontext_32 ) ))
259
262
return - EFAULT ;
260
263
264
+ unsafe_put_sigcontext32 (& frame -> sc , fp , regs , set , Efault );
265
+ user_access_end ();
266
+
261
267
if (__put_user (set -> sig [1 ], & frame -> extramask [0 ]))
262
268
return - EFAULT ;
263
269
@@ -301,6 +307,9 @@ int ia32_setup_frame(int sig, struct ksignal *ksig,
301
307
regs -> ss = __USER32_DS ;
302
308
303
309
return 0 ;
310
+ Efault :
311
+ user_access_end ();
312
+ return - EFAULT ;
304
313
}
305
314
306
315
int ia32_setup_rt_frame (int sig , struct ksignal * ksig ,
@@ -309,7 +318,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
309
318
struct rt_sigframe_ia32 __user * frame ;
310
319
void __user * restorer ;
311
320
int err = 0 ;
312
- void __user * fpstate = NULL ;
321
+ void __user * fp = NULL ;
313
322
314
323
/* __copy_to_user optimizes that into a single 8 byte store */
315
324
static const struct {
@@ -324,7 +333,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
324
333
0 ,
325
334
};
326
335
327
- frame = get_sigframe (ksig , regs , sizeof (* frame ), & fpstate );
336
+ frame = get_sigframe (ksig , regs , sizeof (* frame ), & fp );
328
337
329
338
if (!user_access_begin (frame , sizeof (* frame )))
330
339
return - EFAULT ;
@@ -355,9 +364,12 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
355
364
unsafe_put_user (* ((u64 * )& code ), (u64 __user * )frame -> retcode , Efault );
356
365
user_access_end ();
357
366
358
- err |= __copy_siginfo_to_user32 (& frame -> info , & ksig -> info , false);
359
- err |= ia32_setup_sigcontext (& frame -> uc .uc_mcontext , fpstate ,
360
- regs , set -> sig [0 ]);
367
+ if (__copy_siginfo_to_user32 (& frame -> info , & ksig -> info , false))
368
+ return - EFAULT ;
369
+ if (!user_access_begin (& frame -> uc .uc_mcontext , sizeof (struct sigcontext_32 )))
370
+ return - EFAULT ;
371
+ unsafe_put_sigcontext32 (& frame -> uc .uc_mcontext , fp , regs , set , Efault );
372
+ user_access_end ();
361
373
err |= __put_user (* (__u64 * )set , (__u64 __user * )& frame -> uc .uc_sigmask );
362
374
363
375
if (err )
0 commit comments