diff --git a/kernel/proc/proc.c b/kernel/proc/proc.c index c0081ab..0289034 100644 --- a/kernel/proc/proc.c +++ b/kernel/proc/proc.c @@ -194,6 +194,13 @@ void proc_reaper(void) { LL_REMOVE(PROCS.procs, zombie); + for (size_t i = 0; i < zombie->vobjcnt; i++) { + if (zombie->vobjs[i] != NULL) { + vfs_close(zombie->vobjs[i]); + zombie->vobjs[i] = NULL; + } + } + pmm_free((uintptr_t)(zombie->platformdata.kstack - PROC_STACKSIZE), PROC_STACKBLOCKS); if (!zombie->kern) { diff --git a/kernel/syscall/ioctl.c b/kernel/syscall/ioctl.c index 4c1ce3c..f5b5ba7 100644 --- a/kernel/syscall/ioctl.c +++ b/kernel/syscall/ioctl.c @@ -55,6 +55,11 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) { spinlock_release(&PROCS.spinlock); } break; case IOCTL_CLOSEF: { + if (ioh >= PROC_VFSHANDLES_MAX) { + ret = E_INVALIDARGUMENT; + goto done; + } + spinlock_acquire(&PROCS.spinlock); Proc *proc = PROCS.current; VfsObj *vobj = proc->vobjs[ioh]; @@ -65,7 +70,15 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) { goto done; } + size_t i = 0; + for (; i < PROC_VFSHANDLES_MAX; i++) { + if (proc->vobjs[i] == vobj) { + break; + } + } + vfs_close(vobj); + proc->vobjs[i] = NULL; ret = E_OK; } break; case IOCTL_WRITE: {