@@ -1002,7 +1002,7 @@ struct wait_opts {
1002
1002
struct pid * wo_pid ;
1003
1003
1004
1004
struct siginfo __user * wo_info ;
1005
- int __user * wo_stat ;
1005
+ int wo_stat ;
1006
1006
struct rusage * wo_rusage ;
1007
1007
1008
1008
wait_queue_t child_wait ;
@@ -1189,8 +1189,7 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
1189
1189
retval = 0 ;
1190
1190
status = (p -> signal -> flags & SIGNAL_GROUP_EXIT )
1191
1191
? p -> signal -> group_exit_code : p -> exit_code ;
1192
- if (!retval && wo -> wo_stat )
1193
- retval = put_user (status , wo -> wo_stat );
1192
+ wo -> wo_stat = status ;
1194
1193
1195
1194
infop = wo -> wo_info ;
1196
1195
if (!retval && infop )
@@ -1322,8 +1321,7 @@ static int wait_task_stopped(struct wait_opts *wo,
1322
1321
if (wo -> wo_rusage )
1323
1322
getrusage (p , RUSAGE_BOTH , wo -> wo_rusage );
1324
1323
retval = 0 ;
1325
- if (!retval && wo -> wo_stat )
1326
- retval = put_user ((exit_code << 8 ) | 0x7f , wo -> wo_stat );
1324
+ wo -> wo_stat = (exit_code << 8 ) | 0x7f ;
1327
1325
1328
1326
infop = wo -> wo_info ;
1329
1327
if (!retval && infop )
@@ -1383,12 +1381,9 @@ static int wait_task_continued(struct wait_opts *wo, struct task_struct *p)
1383
1381
if (!wo -> wo_info ) {
1384
1382
if (wo -> wo_rusage )
1385
1383
getrusage (p , RUSAGE_BOTH , wo -> wo_rusage );
1386
- retval = 0 ;
1387
1384
put_task_struct (p );
1388
- if (!retval && wo -> wo_stat )
1389
- retval = put_user (0xffff , wo -> wo_stat );
1390
- if (!retval )
1391
- retval = pid ;
1385
+ wo -> wo_stat = 0xffff ;
1386
+ retval = pid ;
1392
1387
} else {
1393
1388
retval = wait_noreap_copyout (wo , p , pid , uid ,
1394
1389
CLD_CONTINUED , SIGCONT );
@@ -1662,7 +1657,6 @@ static long kernel_waitid(int which, pid_t upid, struct siginfo __user *infop,
1662
1657
wo .wo_pid = pid ;
1663
1658
wo .wo_flags = options ;
1664
1659
wo .wo_info = infop ;
1665
- wo .wo_stat = NULL ;
1666
1660
wo .wo_rusage = ru ;
1667
1661
ret = do_wait (& wo );
1668
1662
@@ -1734,10 +1728,12 @@ static long kernel_wait4(pid_t upid, int __user *stat_addr,
1734
1728
wo .wo_pid = pid ;
1735
1729
wo .wo_flags = options | WEXITED ;
1736
1730
wo .wo_info = NULL ;
1737
- wo .wo_stat = stat_addr ;
1731
+ wo .wo_stat = 0 ;
1738
1732
wo .wo_rusage = ru ;
1739
1733
ret = do_wait (& wo );
1740
1734
put_pid (pid );
1735
+ if (ret > 0 && stat_addr && put_user (wo .wo_stat , stat_addr ))
1736
+ ret = - EFAULT ;
1741
1737
1742
1738
return ret ;
1743
1739
}
0 commit comments