From b89882e1cf2e8eb6d7fff0b4ef664237410ea179 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Sat, 6 Sep 2025 09:31:05 +0200 Subject: [PATCH] VFS object auto cleanup --- kernel/proc/proc.c | 7 +++++++ kernel/syscall/ioctl.c | 13 +++++++++++++ 2 files changed, 20 insertions(+) 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: {