diff --git a/kernel/syscall/ioctl.c b/kernel/syscall/ioctl.c index f5b5ba7..c693f07 100644 --- a/kernel/syscall/ioctl.c +++ b/kernel/syscall/ioctl.c @@ -43,16 +43,15 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) { } spinlock_acquire(&PROCS.spinlock); - Proc *proc = PROCS.current; + spinlock_release(&PROCS.spinlock); + if (proc->vobjcnt < PROC_VFSHANDLES_MAX) { proc->vobjs[proc->vobjcnt++] = vobj; ret = proc->vobjcnt - 1; } else { ret = E_NOMEMORY; } - - spinlock_release(&PROCS.spinlock); } break; case IOCTL_CLOSEF: { if (ioh >= PROC_VFSHANDLES_MAX) { @@ -62,9 +61,10 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) { spinlock_acquire(&PROCS.spinlock); Proc *proc = PROCS.current; - VfsObj *vobj = proc->vobjs[ioh]; spinlock_release(&PROCS.spinlock); + VfsObj *vobj = proc->vobjs[ioh]; + if (vobj == NULL) { ret = E_INVALIDARGUMENT; goto done; @@ -101,8 +101,9 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) { spinlock_acquire(&PROCS.spinlock); Proc *proc = PROCS.current; - VfsObj *vobj = proc->vobjs[ioh]; spinlock_release(&PROCS.spinlock); + + VfsObj *vobj = proc->vobjs[ioh]; if (vobj == NULL) { ret = E_INVALIDARGUMENT; @@ -131,9 +132,10 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) { spinlock_acquire(&PROCS.spinlock); Proc *proc = PROCS.current; - VfsObj *vobj = proc->vobjs[ioh]; spinlock_release(&PROCS.spinlock); + VfsObj *vobj = proc->vobjs[ioh]; + if (vobj == NULL) { ret = E_INVALIDARGUMENT; goto done; diff --git a/kernel/syscall/processctl.c b/kernel/syscall/processctl.c index 6daef58..3073c53 100644 --- a/kernel/syscall/processctl.c +++ b/kernel/syscall/processctl.c @@ -12,15 +12,15 @@ int32_t SYSCALL3(sys_processctl, pid1, cmd1, optsptr1) { uint64_t pid = pid1; uint64_t cmd = cmd1; int32_t ret = E_OK; - - spinlock_acquire(&PROCS.spinlock); - + if (pid == PID_SELF_MAGIC) { pid = PROCS.current->pid; } + spinlock_acquire(&PROCS.spinlock); Proc *proc = NULL; LL_FINDPROP(PROCS.procs, proc, pid, pid); + spinlock_release(&PROCS.spinlock); if (proc == NULL) { ret = E_INVALIDARGUMENT; @@ -31,15 +31,12 @@ int32_t SYSCALL3(sys_processctl, pid1, cmd1, optsptr1) { case PCTL_KILL: { proc_kill(proc); ret = E_DOSCHEDULING; - goto done; } break; default: { ret = E_INVALIDARGUMENT; - goto done; } break; } done: - spinlock_release(&PROCS.spinlock); return ret; }