git: 31fa677e4af0 - main - kern_proc.c: ensure stability of the vmspace for sysctl kern.proc.vm_layout

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Sun, 21 Jun 2026 11:48:04 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=31fa677e4af00b795bf671847b4dc72960c90f14

commit 31fa677e4af00b795bf671847b4dc72960c90f14
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-06-14 23:49:20 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-06-21 11:46:53 +0000

    kern_proc.c: ensure stability of the vmspace for sysctl kern.proc.vm_layout
    
    Reviewed by:    markj
    Tested by:      pho
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D57497
---
 sys/kern/kern_proc.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 1fff6e5629ea..a42d528cc9c1 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -3290,6 +3290,7 @@ sysctl_kern_proc_vm_layout(SYSCTL_HANDLER_ARGS)
 {
 	struct kinfo_vm_layout kvm;
 	struct proc *p;
+	struct thread *td;
 	struct vmspace *vmspace;
 	int error, *name;
 
@@ -3297,6 +3298,7 @@ sysctl_kern_proc_vm_layout(SYSCTL_HANDLER_ARGS)
 	if ((u_int)arg2 != 1)
 		return (EINVAL);
 
+	td = curthread;
 	error = pget((pid_t)name[0], PGET_CANDEBUG, &p);
 	if (error != 0)
 		return (error);
@@ -3308,8 +3310,13 @@ sysctl_kern_proc_vm_layout(SYSCTL_HANDLER_ARGS)
 		}
 	}
 #endif
-	vmspace = vmspace_acquire_ref(p);
+	_PHOLD(p);
 	PROC_UNLOCK(p);
+	error = proc_vmspace_ref(td, p, PRVM_CHECK_DEBUG, &vmspace);
+	if (error != 0) {
+		PRELE(p);
+		return (error);
+	}
 
 	memset(&kvm, 0, sizeof(kvm));
 	kvm.kvm_min_user_addr = vm_map_min(&vmspace->vm_map);
@@ -3361,7 +3368,8 @@ sysctl_kern_proc_vm_layout(SYSCTL_HANDLER_ARGS)
 #ifdef COMPAT_FREEBSD32
 out:
 #endif
-	vmspace_free(vmspace);
+	proc_vmspace_unref(td, p, PRVM_CHECK_DEBUG, vmspace);
+	PRELE(p);
 	return (error);
 }