@@ -140,12 +140,10 @@ static int restore_sigcontext(struct pt_regs *regs,
140
140
IS_ENABLED (CONFIG_X86_32 ));
141
141
}
142
142
143
- static int setup_sigcontext (struct sigcontext __user * sc , void __user * fpstate ,
143
+ static __always_inline int
144
+ __unsafe_setup_sigcontext (struct sigcontext __user * sc , void __user * fpstate ,
144
145
struct pt_regs * regs , unsigned long mask )
145
146
{
146
- if (!user_access_begin (sc , sizeof (struct sigcontext )))
147
- return - EFAULT ;
148
-
149
147
#ifdef CONFIG_X86_32
150
148
unsafe_put_user (get_user_gs (regs ),
151
149
(unsigned int __user * )& sc -> gs , Efault );
@@ -194,13 +192,17 @@ static int setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate,
194
192
/* non-iBCS2 extensions.. */
195
193
unsafe_put_user (mask , & sc -> oldmask , Efault );
196
194
unsafe_put_user (current -> thread .cr2 , & sc -> cr2 , Efault );
197
- user_access_end ();
198
195
return 0 ;
199
196
Efault :
200
- user_access_end ();
201
197
return - EFAULT ;
202
198
}
203
199
200
+ #define unsafe_put_sigcontext (sc , fp , regs , set , label ) \
201
+ do { \
202
+ if (__unsafe_setup_sigcontext(sc, fp, regs, set->sig[0])) \
203
+ goto label; \
204
+ } while(0);
205
+
204
206
/*
205
207
* Set up a signal frame.
206
208
*/
@@ -301,18 +303,20 @@ __setup_frame(int sig, struct ksignal *ksig, sigset_t *set,
301
303
struct sigframe __user * frame ;
302
304
void __user * restorer ;
303
305
int err = 0 ;
304
- void __user * fpstate = NULL ;
306
+ void __user * fp = NULL ;
305
307
306
- frame = get_sigframe (& ksig -> ka , regs , sizeof (* frame ), & fpstate );
308
+ frame = get_sigframe (& ksig -> ka , regs , sizeof (* frame ), & fp );
307
309
308
310
if (!access_ok (frame , sizeof (* frame )))
309
311
return - EFAULT ;
310
312
311
313
if (__put_user (sig , & frame -> sig ))
312
314
return - EFAULT ;
313
315
314
- if (setup_sigcontext (& frame -> sc , fpstate , regs , set -> sig [ 0 ] ))
316
+ if (! user_access_begin (& frame -> sc , sizeof ( struct sigcontext ) ))
315
317
return - EFAULT ;
318
+ unsafe_put_sigcontext (& frame -> sc , fp , regs , set , Efault );
319
+ user_access_end ();
316
320
317
321
if (__put_user (set -> sig [1 ], & frame -> extramask [0 ]))
318
322
return - EFAULT ;
@@ -353,6 +357,10 @@ __setup_frame(int sig, struct ksignal *ksig, sigset_t *set,
353
357
regs -> cs = __USER_CS ;
354
358
355
359
return 0 ;
360
+
361
+ Efault :
362
+ user_access_end ();
363
+ return - EFAULT ;
356
364
}
357
365
358
366
static int __setup_rt_frame (int sig , struct ksignal * ksig ,
@@ -361,9 +369,9 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
361
369
struct rt_sigframe __user * frame ;
362
370
void __user * restorer ;
363
371
int err = 0 ;
364
- void __user * fpstate = NULL ;
372
+ void __user * fp = NULL ;
365
373
366
- frame = get_sigframe (& ksig -> ka , regs , sizeof (* frame ), & fpstate );
374
+ frame = get_sigframe (& ksig -> ka , regs , sizeof (* frame ), & fp );
367
375
368
376
if (!user_access_begin (frame , sizeof (* frame )))
369
377
return - EFAULT ;
@@ -395,13 +403,11 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
395
403
* signal handler stack frames.
396
404
*/
397
405
unsafe_put_user (* ((u64 * )& rt_retcode ), (u64 * )frame -> retcode , Efault );
406
+ unsafe_put_sigcontext (& frame -> uc .uc_mcontext , fp , regs , set , Efault );
398
407
user_access_end ();
399
408
400
409
err |= copy_siginfo_to_user (& frame -> info , & ksig -> info );
401
- err |= setup_sigcontext (& frame -> uc .uc_mcontext , fpstate ,
402
- regs , set -> sig [0 ]);
403
410
err |= __copy_to_user (& frame -> uc .uc_sigmask , set , sizeof (* set ));
404
-
405
411
if (err )
406
412
return - EFAULT ;
407
413
@@ -472,9 +478,8 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
472
478
/* Set up to return from userspace. If provided, use a stub
473
479
already in userspace. */
474
480
unsafe_put_user (ksig -> ka .sa .sa_restorer , & frame -> pretcode , Efault );
481
+ unsafe_put_sigcontext (& frame -> uc .uc_mcontext , fp , regs , set , Efault );
475
482
user_access_end ();
476
-
477
- err |= setup_sigcontext (& frame -> uc .uc_mcontext , fp , regs , set -> sig [0 ]);
478
483
err |= __put_user (set -> sig [0 ], & frame -> uc .uc_sigmask .sig [0 ]);
479
484
480
485
if (err )
@@ -532,12 +537,12 @@ static int x32_setup_rt_frame(struct ksignal *ksig,
532
537
unsigned long uc_flags ;
533
538
void __user * restorer ;
534
539
int err = 0 ;
535
- void __user * fpstate = NULL ;
540
+ void __user * fp = NULL ;
536
541
537
542
if (!(ksig -> ka .sa .sa_flags & SA_RESTORER ))
538
543
return - EFAULT ;
539
544
540
- frame = get_sigframe (& ksig -> ka , regs , sizeof (* frame ), & fpstate );
545
+ frame = get_sigframe (& ksig -> ka , regs , sizeof (* frame ), & fp );
541
546
542
547
if (!access_ok (frame , sizeof (* frame )))
543
548
return - EFAULT ;
@@ -559,10 +564,8 @@ static int x32_setup_rt_frame(struct ksignal *ksig,
559
564
unsafe_put_user (0 , & frame -> uc .uc__pad0 , Efault );
560
565
restorer = ksig -> ka .sa .sa_restorer ;
561
566
unsafe_put_user (restorer , (unsigned long __user * )& frame -> pretcode , Efault );
567
+ unsafe_put_sigcontext (& frame -> uc .uc_mcontext , fp , regs , set , Efault );
562
568
user_access_end ();
563
-
564
- err |= setup_sigcontext (& frame -> uc .uc_mcontext , fpstate ,
565
- regs , set -> sig [0 ]);
566
569
err |= __put_user (* (__u64 * )set , (__u64 __user * )& frame -> uc .uc_sigmask );
567
570
568
571
if (err )
0 commit comments