git: 390ae06d4f52 - main - procctl(PROC_REAP_GETPIDS): re-validate reaper after relock of proctree_lock
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 06 Jun 2026 20:07:29 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=390ae06d4f524a6f32383cbc1bcbdecdb3738bc3
commit 390ae06d4f524a6f32383cbc1bcbdecdb3738bc3
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-06-05 23:29:23 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-06-06 20:00:30 +0000
procctl(PROC_REAP_GETPIDS): re-validate reaper after relock of proctree_lock
Reviewed by: markj
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D57487
---
sys/kern/kern_procctl.c | 43 ++++++++++++++++++++++++++++++++-----------
1 file changed, 32 insertions(+), 11 deletions(-)
diff --git a/sys/kern/kern_procctl.c b/sys/kern/kern_procctl.c
index db9de394c101..1ff1b15767b5 100644
--- a/sys/kern/kern_procctl.c
+++ b/sys/kern/kern_procctl.c
@@ -203,28 +203,49 @@ reap_status(struct thread *td, struct proc *p, void *data)
return (0);
}
+static int
+reap_getpids_count(struct proc **reapp, struct proc *p,
+ const struct procctl_reaper_pids *rp)
+{
+ struct proc *reap, *p2;
+ int n;
+
+ sx_assert(&proctree_lock, SX_LOCKED);
+
+ reap = get_reaper_or_p(p);
+ n = 0;
+ LIST_FOREACH(p2, &reap->p_reaplist, p_reapsibling)
+ n++;
+ if (rp->rp_count < n)
+ n = rp->rp_count;
+ *reapp = reap;
+ return (n);
+}
+
static int
reap_getpids(struct thread *td, struct proc *p, void *data)
{
struct proc *reap, *p2;
struct procctl_reaper_pidinfo *pi, *pip;
struct procctl_reaper_pids *rp;
- u_int i, n;
+ u_int i, n, n1;
int error;
rp = data;
sx_assert(&proctree_lock, SX_LOCKED);
PROC_UNLOCK(p);
- reap = (p->p_treeflag & P_TREE_REAPER) == 0 ? p->p_reaper : p;
- n = i = 0;
- error = 0;
- LIST_FOREACH(p2, &reap->p_reaplist, p_reapsibling)
- n++;
- sx_unlock(&proctree_lock);
- if (rp->rp_count < n)
- n = rp->rp_count;
- pi = malloc(n * sizeof(*pi), M_TEMP, M_WAITOK);
- sx_slock(&proctree_lock);
+ i = 0;
+ for (;;) {
+ n1 = reap_getpids_count(&reap, p, rp);
+ sx_unlock(&proctree_lock);
+ pi = mallocarray(n1, sizeof(*pi), M_TEMP, M_WAITOK);
+ sx_slock(&proctree_lock);
+ n = reap_getpids_count(&reap, p, rp);
+ if (n <= n1)
+ break;
+ free(pi, M_TEMP);
+ }
+
LIST_FOREACH(p2, &reap->p_reaplist, p_reapsibling) {
if (i == n)
break;