git: d7d5337291c9 - stable/14 - procfs, linprocfs: ensure target process vmspace stability

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Sun, 28 Jun 2026 00:30:16 UTC
The branch stable/14 has been updated by kib:

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

commit d7d5337291c983ba969e24c95df0bcab46b44621
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-06-07 18:48:59 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-06-28 00:29:04 +0000

    procfs, linprocfs: ensure target process vmspace stability
    
    (cherry picked from commit 5db31f1b47b586a5091eb41fc957236f28b78dba)
---
 sys/compat/linprocfs/linprocfs.c | 16 +++++-----------
 sys/fs/procfs/procfs_map.c       | 17 +++++++----------
 sys/fs/procfs/procfs_mem.c       |  6 +-----
 3 files changed, 13 insertions(+), 26 deletions(-)

diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c
index 1171e2c98342..f2dd38576205 100644
--- a/sys/compat/linprocfs/linprocfs.c
+++ b/sys/compat/linprocfs/linprocfs.c
@@ -1313,19 +1313,13 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
 	struct vattr vat;
 	bool private;
 
-	PROC_LOCK(p);
-	error = p_candebug(td, p);
-	PROC_UNLOCK(p);
-	if (error)
-		return (error);
-
 	if (uio->uio_rw != UIO_READ)
 		return (EOPNOTSUPP);
 
-	error = 0;
-	vm = vmspace_acquire_ref(p);
-	if (vm == NULL)
-		return (ESRCH);
+	error = proc_vmspace_ref(td, p, PRVM_BLOCK_EXEC | PRVM_CHECK_DEBUG,
+	    &vm);
+	if (error != 0)
+		return (error);
 
 	if (SV_CURPROC_FLAG(SV_LP64))
 		l_map_str = l64_map_str;
@@ -1423,7 +1417,7 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
 		}
 	}
 	vm_map_unlock_read(map);
-	vmspace_free(vm);
+	proc_vmspace_unref(td, p, PRVM_CHECK_DEBUG | PRVM_BLOCK_EXEC, vm);
 
 	return (error);
 }
diff --git a/sys/fs/procfs/procfs_map.c b/sys/fs/procfs/procfs_map.c
index db6b225f6426..5ccef979856b 100644
--- a/sys/fs/procfs/procfs_map.c
+++ b/sys/fs/procfs/procfs_map.c
@@ -42,6 +42,7 @@
 #include <sys/malloc.h>
 #include <sys/mount.h>
 #include <sys/proc.h>
+#include <sys/ptrace.h>
 #include <sys/resourcevar.h>
 #include <sys/rwlock.h>
 #include <sys/sbuf.h>
@@ -95,15 +96,14 @@ procfs_doprocmap(PFS_FILL_ARGS)
 	bool wrap32;
 #endif
 
-	PROC_LOCK(p);
-	error = p_candebug(td, p);
-	PROC_UNLOCK(p);
-	if (error)
-		return (error);
-
 	if (uio->uio_rw != UIO_READ)
 		return (EOPNOTSUPP);
 
+	error = proc_vmspace_ref(td, p, PRVM_BLOCK_EXEC | PRVM_CHECK_DEBUG,
+	    &vm);
+	if (error != 0)
+		return (error);
+
 #ifdef COMPAT_FREEBSD32
 	wrap32 = false;
 	if (SV_CURPROC_FLAG(SV_ILP32)) {
@@ -113,9 +113,6 @@ procfs_doprocmap(PFS_FILL_ARGS)
 	}
 #endif
 
-	vm = vmspace_acquire_ref(p);
-	if (vm == NULL)
-		return (ESRCH);
 	map = &vm->vm_map;
 	vm_map_lock_read(map);
 	VM_MAP_ENTRY_FOREACH(entry, map) {
@@ -240,6 +237,6 @@ procfs_doprocmap(PFS_FILL_ARGS)
 		}
 	}
 	vm_map_unlock_read(map);
-	vmspace_free(vm);
+	proc_vmspace_unref(td, p, PRVM_BLOCK_EXEC | PRVM_CHECK_DEBUG, vm);
 	return (error);
 }
diff --git a/sys/fs/procfs/procfs_mem.c b/sys/fs/procfs/procfs_mem.c
index 50db7d3a0b96..5fc0c1acf140 100644
--- a/sys/fs/procfs/procfs_mem.c
+++ b/sys/fs/procfs/procfs_mem.c
@@ -61,11 +61,7 @@ procfs_doprocmem(PFS_FILL_ARGS)
 	if (uio->uio_resid == 0)
 		return (0);
 
-	PROC_LOCK(p);
-	error = p_candebug(td, p);
-	PROC_UNLOCK(p);
-	if (error == 0)
-		error = proc_rwmem(p, uio, 0);
+	error = proc_rwmem(p, uio, PRVM_CHECK_DEBUG | PRVM_BLOCK_EXEC);
 
 	return (error);
 }