diff options
author | Andreas Kling <awesomekling@gmail.com> | 2018-11-17 00:52:29 +0100 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2018-11-17 00:52:29 +0100 |
commit | 95e0f6ad82d8305e77e8ab02268abb57f5cbc804 (patch) | |
tree | fda3a55a177f5fe56e1152ab45658fdd60ae7872 /Kernel | |
parent | bb9766ee17a97735383d21ad873aed5d6cd65a9c (diff) | |
download | serenity-95e0f6ad82d8305e77e8ab02268abb57f5cbc804.zip |
Fix race condition in exec().
...also hook up sys$fstat in the syscall dispatcher.
Diffstat (limited to 'Kernel')
-rw-r--r-- | Kernel/Process.cpp | 6 | ||||
-rw-r--r-- | Kernel/Syscall.cpp | 4 |
2 files changed, 8 insertions, 2 deletions
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 3acd64464f..94ab2fdd6b 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -363,7 +363,11 @@ int Process::do_exec(const String& path, Vector<String>&& arguments, Vector<Stri } } - InterruptDisabler disabler; + // We cli() manually here because we don't want to get interrupted between do_exec() and Schedule::yield(). + // The reason is that the task redirection we've set up above will be clobbered by the timer IRQ. + // If we used an InterruptDisabler that sti()'d on exit, we might timer tick'd too soon in exec(). + cli(); + Scheduler::prepare_to_modify_tss(*this); m_name = parts.takeLast(); diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp index f586d702ef..99e9969a9d 100644 --- a/Kernel/Syscall.cpp +++ b/Kernel/Syscall.cpp @@ -173,8 +173,10 @@ static dword handle(RegisterDump& regs, dword function, dword arg1, dword arg2, return current->sys$fcntl((int)arg1, (int)arg2, (dword)arg3); case Syscall::SC_ioctl: return current->sys$ioctl((int)arg1, (unsigned)arg2, (unsigned)arg3); + case Syscall::SC_fstat: + return current->sys$fstat((int)arg1, (Unix::stat*)arg2); default: - kprintf("<%u> int0x80: Unknown function %x requested {%x, %x, %x}\n", current->pid(), function, arg1, arg2, arg3); + kprintf("<%u> int0x80: Unknown function %u requested {%x, %x, %x}\n", current->pid(), function, arg1, arg2, arg3); break; } return 0; |