The branch main has been updated by kib:

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

commit 5db31f1b47b586a5091eb41fc957236f28b78dba
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2026-06-07 18:48:59 +0000
Commit:     Konstantin Belousov <[email protected]>
CommitDate: 2026-06-21 11:46:54 +0000

    procfs, linprocfs: ensure target process vmspace stability
    
    Reviewed by:    markj
    Tested by:      pho
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D57497
---
 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 a0deea73d19c..b0e6a3a15bea 100644
--- a/sys/compat/linprocfs/linprocfs.c
+++ b/sys/compat/linprocfs/linprocfs.c
@@ -1311,19 +1311,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;
@@ -1421,7 +1415,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 d4913a7b0f1d..1ed785f1ad90 100644
--- a/sys/fs/procfs/procfs_map.c
+++ b/sys/fs/procfs/procfs_map.c
@@ -40,6 +40,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>
@@ -93,15 +94,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)) {
@@ -111,9 +111,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) {
@@ -238,6 +235,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 824fcd33b2ef..eb692c32923b 100644
--- a/sys/fs/procfs/procfs_mem.c
+++ b/sys/fs/procfs/procfs_mem.c
@@ -60,11 +60,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);
 }

Reply via email to