summaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern')
-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);