diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2026-06-14 23:49:20 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2026-06-21 11:46:53 +0000 |
| commit | 31fa677e4af00b795bf671847b4dc72960c90f14 (patch) | |
| tree | 5d616f44bc7584d88eaf7507ccb3b2ed1667db8b | |
| parent | 5fe6e08d2db56b530f0df2903ef24cfabab7b8ea (diff) | |
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
| -rw-r--r-- | sys/kern/kern_proc.c | 12 |
1 files 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); } |
