diff options
Diffstat (limited to 'sys/kern/kern_exit.c')
-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); |