diff options
author | Ian Moffett <ian@osmora.org> | 2025-07-10 03:22:29 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-07-10 03:22:29 -0400 |
commit | 35cc0ad861e12382d22bce773db664e0f59e7648 (patch) | |
tree | fd0b3fb1e73b7c2292c681b3a0c6a3c252bb0fa8 /sys/kern | |
parent | d7c7f87432aa2d20eefd3b4f38a78eba5e7373a0 (diff) |
kernel: exit: Clear out file descriptors on reap
Ensure all file descriptors are freed and their respective vnodes
released.
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_exit.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index a4bf0f9..b1bd9ba 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -31,6 +31,8 @@ #include <sys/sched.h> #include <sys/syslog.h> #include <sys/panic.h> +#include <sys/filedesc.h> +#include <sys/vnode.h> #include <vm/physmem.h> #include <vm/dynalloc.h> #include <vm/vm.h> @@ -83,9 +85,23 @@ void proc_reap(struct proc *td) { struct pcb *pcbp; + struct filedesc *fdp; vaddr_t stack_va; paddr_t stack_pa; + /* Clear out all fds */ + for (size_t i = 4; i < PROC_MAX_FILEDES; ++i) { + fdp = td->fds[i]; + if (fdp == NULL) { + continue; + } + if (fdp->refcnt == 1) { + vfs_release_vnode(fdp->vp); + dynfree(fdp); + fdp = NULL; + } + } + pcbp = &td->pcb; unload_td(td); |