@@ -1174,6 +1174,7 @@ kern_wait6(struct thread *td, idtype_t idtype, id_t id, int *status,
1174
1174
struct proc * p , * q ;
1175
1175
pid_t pid ;
1176
1176
int error , nfound , ret ;
1177
+ bool report ;
1177
1178
1178
1179
AUDIT_ARG_VALUE ((int )idtype ); /* XXX - This is likely wrong! */
1179
1180
AUDIT_ARG_PID ((pid_t )id ); /* XXX - This may be wrong! */
@@ -1225,36 +1226,38 @@ kern_wait6(struct thread *td, idtype_t idtype, id_t id, int *status,
1225
1226
nfound ++ ;
1226
1227
PROC_LOCK_ASSERT (p , MA_OWNED );
1227
1228
1228
- if ((options & (WTRAPPED | WUNTRACED )) != 0 )
1229
- PROC_SLOCK (p );
1230
-
1231
1229
if ((options & WTRAPPED ) != 0 &&
1232
- (p -> p_flag & P_TRACED ) != 0 &&
1233
- (p -> p_flag & (P_STOPPED_TRACE | P_STOPPED_SIG )) != 0 &&
1234
- p -> p_suspcount == p -> p_numthreads &&
1235
- (p -> p_flag & P_WAITED ) == 0 ) {
1230
+ (p -> p_flag & P_TRACED ) != 0 ) {
1231
+ PROC_SLOCK (p );
1232
+ report =
1233
+ ((p -> p_flag & (P_STOPPED_TRACE | P_STOPPED_SIG )) &&
1234
+ p -> p_suspcount == p -> p_numthreads &&
1235
+ (p -> p_flag & P_WAITED ) == 0 );
1236
1236
PROC_SUNLOCK (p );
1237
+ if (report ) {
1237
1238
CTR4 (KTR_PTRACE ,
1238
1239
"wait: returning trapped pid %d status %#x "
1239
1240
"(xstat %d) xthread %d" ,
1240
1241
p -> p_pid , W_STOPCODE (p -> p_xsig ), p -> p_xsig ,
1241
1242
p -> p_xthread != NULL ?
1242
1243
p -> p_xthread -> td_tid : -1 );
1243
- report_alive_proc (td , p , siginfo , status , options ,
1244
- CLD_TRAPPED );
1245
- return (0 );
1244
+ report_alive_proc (td , p , siginfo , status ,
1245
+ options , CLD_TRAPPED );
1246
+ return (0 );
1247
+ }
1246
1248
}
1247
1249
if ((options & WUNTRACED ) != 0 &&
1248
- (p -> p_flag & P_STOPPED_SIG ) != 0 &&
1249
- p -> p_suspcount == p -> p_numthreads &&
1250
- (p -> p_flag & P_WAITED ) == 0 ) {
1250
+ (p -> p_flag & P_STOPPED_SIG ) != 0 ) {
1251
+ PROC_SLOCK (p );
1252
+ report = (p -> p_suspcount == p -> p_numthreads &&
1253
+ ((p -> p_flag & P_WAITED ) == 0 ));
1251
1254
PROC_SUNLOCK (p );
1252
- report_alive_proc (td , p , siginfo , status , options ,
1253
- CLD_STOPPED );
1254
- return (0 );
1255
+ if (report ) {
1256
+ report_alive_proc (td , p , siginfo , status ,
1257
+ options , CLD_STOPPED );
1258
+ return (0 );
1259
+ }
1255
1260
}
1256
- if ((options & (WTRAPPED | WUNTRACED )) != 0 )
1257
- PROC_SUNLOCK (p );
1258
1261
if ((options & WCONTINUED ) != 0 &&
1259
1262
(p -> p_flag & P_CONTINUED ) != 0 ) {
1260
1263
report_alive_proc (td , p , siginfo , status , options ,
0 commit comments