@@ -326,35 +326,34 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
326
326
327
327
frame = get_sigframe (ksig , regs , sizeof (* frame ), & fpstate );
328
328
329
- if (!access_ok (frame , sizeof (* frame )))
329
+ if (!user_access_begin (frame , sizeof (* frame )))
330
330
return - EFAULT ;
331
331
332
- put_user_try {
333
- put_user_ex (sig , & frame -> sig );
334
- put_user_ex (ptr_to_compat (& frame -> info ), & frame -> pinfo );
335
- put_user_ex (ptr_to_compat (& frame -> uc ), & frame -> puc );
332
+ unsafe_put_user (sig , & frame -> sig , Efault );
333
+ unsafe_put_user (ptr_to_compat (& frame -> info ), & frame -> pinfo , Efault );
334
+ unsafe_put_user (ptr_to_compat (& frame -> uc ), & frame -> puc , Efault );
336
335
337
- /* Create the ucontext. */
338
- if (static_cpu_has (X86_FEATURE_XSAVE ))
339
- put_user_ex (UC_FP_XSTATE , & frame -> uc .uc_flags );
340
- else
341
- put_user_ex (0 , & frame -> uc .uc_flags );
342
- put_user_ex (0 , & frame -> uc .uc_link );
343
- compat_save_altstack_ex (& frame -> uc .uc_stack , regs -> sp );
336
+ /* Create the ucontext. */
337
+ if (static_cpu_has (X86_FEATURE_XSAVE ))
338
+ unsafe_put_user (UC_FP_XSTATE , & frame -> uc .uc_flags , Efault );
339
+ else
340
+ unsafe_put_user (0 , & frame -> uc .uc_flags , Efault );
341
+ unsafe_put_user (0 , & frame -> uc .uc_link , Efault );
342
+ unsafe_compat_save_altstack (& frame -> uc .uc_stack , regs -> sp , Efault );
344
343
345
- if (ksig -> ka .sa .sa_flags & SA_RESTORER )
346
- restorer = ksig -> ka .sa .sa_restorer ;
347
- else
348
- restorer = current -> mm -> context .vdso +
349
- vdso_image_32 .sym___kernel_rt_sigreturn ;
350
- put_user_ex (ptr_to_compat (restorer ), & frame -> pretcode );
344
+ if (ksig -> ka .sa .sa_flags & SA_RESTORER )
345
+ restorer = ksig -> ka .sa .sa_restorer ;
346
+ else
347
+ restorer = current -> mm -> context .vdso +
348
+ vdso_image_32 .sym___kernel_rt_sigreturn ;
349
+ unsafe_put_user (ptr_to_compat (restorer ), & frame -> pretcode , Efault );
351
350
352
- /*
353
- * Not actually used anymore, but left because some gdb
354
- * versions need it.
355
- */
356
- put_user_ex (* ((u64 * )& code ), (u64 __user * )frame -> retcode );
357
- } put_user_catch ( err );
351
+ /*
352
+ * Not actually used anymore, but left because some gdb
353
+ * versions need it.
354
+ */
355
+ unsafe_put_user (* ((u64 * )& code ), (u64 __user * )frame -> retcode , Efault );
356
+ user_access_end ( );
358
357
359
358
err |= __copy_siginfo_to_user32 (& frame -> info , & ksig -> info , false);
360
359
err |= ia32_setup_sigcontext (& frame -> uc .uc_mcontext , fpstate ,
@@ -380,4 +379,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
380
379
regs -> ss = __USER32_DS ;
381
380
382
381
return 0 ;
382
+ Efault :
383
+ user_access_end ();
384
+ return - EFAULT ;
383
385
}
0 commit comments