@@ -1625,15 +1625,18 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
1625
1625
if (!infop )
1626
1626
return err ;
1627
1627
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 ();
1636
1636
return err ;
1637
+ Efault :
1638
+ user_access_end ();
1639
+ return - EFAULT ;
1637
1640
}
1638
1641
1639
1642
static long kernel_wait4 (pid_t upid , int __user * stat_addr ,
@@ -1736,13 +1739,20 @@ COMPAT_SYSCALL_DEFINE5(waitid,
1736
1739
return - EFAULT ;
1737
1740
}
1738
1741
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 ();
1746
1753
return err ;
1754
+ Efault :
1755
+ user_access_end ();
1756
+ return - EFAULT ;
1747
1757
}
1748
1758
#endif
0 commit comments