git: 89fa97f0a71d - main - compat32 wait4/6(2): only copy out when there is a pid to report

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Wed, 10 Jun 2026 02:37:44 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=89fa97f0a71d4988891766c4e69eeb9687016b14

commit 89fa97f0a71d4988891766c4e69eeb9687016b14
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-06-09 21:33:56 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-06-10 02:37:25 +0000

    compat32 wait4/6(2): only copy out when there is a pid to report
    
    PR:     295965
    Reported and tested by: mandree
    Reviewed by:    markj
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D57513
---
 sys/compat/freebsd32/freebsd32_misc.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c
index a0b6118900ed..e4a4f256feb4 100644
--- a/sys/compat/freebsd32/freebsd32_misc.c
+++ b/sys/compat/freebsd32/freebsd32_misc.c
@@ -234,11 +234,9 @@ freebsd32_wait4(struct thread *td, struct freebsd32_wait4_args *uap)
 	else
 		rup = NULL;
 	error = kern_wait(td, uap->pid, &status, uap->options, rup);
-	if (error)
-		return (error);
-	if (uap->status != NULL)
+	if (uap->status != NULL && error == 0 && td->td_retval[0] != 0)
 		error = copyout(&status, uap->status, sizeof(status));
-	if (uap->rusage != NULL && error == 0) {
+	if (uap->rusage != NULL && error == 0 && td->td_retval[0] != 0) {
 		freebsd32_rusage_out(&ru, &ru32);
 		error = copyout(&ru32, uap->rusage, sizeof(ru32));
 	}
@@ -265,11 +263,9 @@ freebsd32_wait6(struct thread *td, struct freebsd32_wait6_args *uap)
 		sip = NULL;
 	error = kern_wait6(td, uap->idtype, PAIR32TO64(id_t, uap->id),
 	    &status, uap->options, wrup, sip);
-	if (error != 0)
-		return (error);
-	if (uap->status != NULL)
+	if (uap->status != NULL && error == 0 && td->td_retval[0] != 0)
 		error = copyout(&status, uap->status, sizeof(status));
-	if (uap->wrusage != NULL && error == 0) {
+	if (uap->wrusage != NULL && error == 0 && td->td_retval[0] != 0) {
 		freebsd32_rusage_out(&wru.wru_self, &wru32.wru_self);
 		freebsd32_rusage_out(&wru.wru_children, &wru32.wru_children);
 		error = copyout(&wru32, uap->wrusage, sizeof(wru32));