@@ -1625,15 +1625,18 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
16251625 if (!infop )
16261626 return err ;
16271627
1628- if ( put_user ( err ? 0 : SIGCHLD , & infop -> si_signo ) ||
1629- put_user ( 0 , & infop -> si_errno ) ||
1630- put_user (( short ) info . cause , & infop -> si_code ) ||
1631- put_user ( info .pid , & infop -> si_pid ) ||
1632- put_user (info .uid , & infop -> si_uid ) ||
1633- put_user (info .status , & infop -> si_status ))
1634- err = - EFAULT ;
1635-
1628+ user_access_begin ();
1629+ unsafe_put_user ( err ? 0 : SIGCHLD , & infop -> si_signo , Efault );
1630+ unsafe_put_user ( 0 , & infop -> si_errno , Efault );
1631+ unsafe_put_user (( short ) info .cause , & infop -> si_code , Efault );
1632+ unsafe_put_user (info .pid , & infop -> si_pid , Efault );
1633+ unsafe_put_user (info .uid , & infop -> si_uid , Efault );
1634+ unsafe_put_user ( info . status , & infop -> si_status , Efault ) ;
1635+ user_access_end ();
16361636 return err ;
1637+ Efault :
1638+ user_access_end ();
1639+ return - EFAULT ;
16371640}
16381641
16391642static long kernel_wait4 (pid_t upid , int __user * stat_addr ,
@@ -1736,13 +1739,20 @@ COMPAT_SYSCALL_DEFINE5(waitid,
17361739 return - EFAULT ;
17371740 }
17381741
1739- if (put_user (err ? 0 : SIGCHLD , & infop -> si_signo ) ||
1740- put_user (0 , & infop -> si_errno ) ||
1741- put_user ((short )info .cause , & infop -> si_code ) ||
1742- put_user (info .pid , & infop -> si_pid ) ||
1743- put_user (info .uid , & infop -> si_uid ) ||
1744- put_user (info .status , & infop -> si_status ))
1745- err = - EFAULT ;
1742+ if (!infop )
1743+ return err ;
1744+
1745+ user_access_begin ();
1746+ unsafe_put_user (err ? 0 : SIGCHLD , & infop -> si_signo , Efault );
1747+ unsafe_put_user (0 , & infop -> si_errno , Efault );
1748+ unsafe_put_user ((short )info .cause , & infop -> si_code , Efault );
1749+ unsafe_put_user (info .pid , & infop -> si_pid , Efault );
1750+ unsafe_put_user (info .uid , & infop -> si_uid , Efault );
1751+ unsafe_put_user (info .status , & infop -> si_status , Efault );
1752+ user_access_end ();
17461753 return err ;
1754+ Efault :
1755+ user_access_end ();
1756+ return - EFAULT ;
17471757}
17481758#endif
0 commit comments