summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-07-10 03:22:29 -0400
committerIan Moffett <ian@osmora.org>2025-07-10 03:22:29 -0400
commit35cc0ad861e12382d22bce773db664e0f59e7648 (patch)
treefd0b3fb1e73b7c2292c681b3a0c6a3c252bb0fa8 /sys
parentd7c7f87432aa2d20eefd3b4f38a78eba5e7373a0 (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')
-rw-r--r--sys/kern/kern_exit.c16
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);