aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2026-06-07 19:32:20 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2026-06-21 11:46:53 +0000
commit4c0a0909f928baac982b7de4bfa5b5ca7de5291a (patch)
tree2141bed85138f5613e87059e713e350d3d5b79af
parente41c28e67fac9cd22a85b160c5c9d0477ed03600 (diff)
pfs_readdir(): block the target process from execing
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/fs/pseudofs/pseudofs_vnops.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/sys/fs/pseudofs/pseudofs_vnops.c b/sys/fs/pseudofs/pseudofs_vnops.c
index a30b5e4f551d..d14ed15f3329 100644
--- a/sys/fs/pseudofs/pseudofs_vnops.c
+++ b/sys/fs/pseudofs/pseudofs_vnops.c
@@ -37,6 +37,7 @@
#include <sys/ctype.h>
#include <sys/dirent.h>
#include <sys/fcntl.h>
+#include <sys/imgact.h>
#include <sys/limits.h>
#include <sys/lock.h>
#include <sys/malloc.h>
@@ -132,6 +133,7 @@ static int
pfs_lookup_proc(pid_t pid, struct proc **p)
{
struct proc *proc;
+ struct thread *td;
proc = pfind(pid);
if (proc == NULL)
@@ -141,8 +143,10 @@ pfs_lookup_proc(pid_t pid, struct proc **p)
return (0);
}
_PHOLD(proc);
- PROC_UNLOCK(proc);
+ td = curthread;
+ execve_block_wait(td, proc);
*p = proc;
+ PROC_UNLOCK(proc);
return (1);
}
@@ -846,6 +850,7 @@ pfs_readdir(struct vop_readdir_args *va)
struct pfs_node *pd = pvd->pvd_pn;
pid_t pid = pvd->pvd_pid;
struct proc *p, *proc;
+ struct thread *td;
struct pfs_node *pn;
struct uio *uio;
struct pfsentry *pfsent, *pfsent2;
@@ -891,11 +896,13 @@ pfs_readdir(struct vop_readdir_args *va)
KASSERT(pid == NO_PID || proc != NULL,
("%s(): no process for pid %lu", __func__, (unsigned long)pid));
+ td = curthread;
if (pid != NO_PID) {
PROC_LOCK(proc);
/* check if the directory is visible to the caller */
if (!pfs_visible_proc(curthread, pd, proc)) {
+ execve_unblock(td, proc);
_PRELE(proc);
PROC_UNLOCK(proc);
pfs_unlock(pd);
@@ -955,6 +962,7 @@ pfs_readdir(struct vop_readdir_args *va)
resid -= PFS_DELEN;
}
if (proc != NULL) {
+ execve_unblock(td, proc);
_PRELE(proc);
PROC_UNLOCK(proc);
}