Skip to content

Commit

Permalink
Kernel: Fix race in clock_nanosleep
Browse files Browse the repository at this point in the history
This is a complete fix of clock_nanosleep, because the thread holds the
process lock again when returning from sleep()/sleep_until().
Therefore, no further concurrent invalidation can occur.
  • Loading branch information
BenWiederhake authored and awesomekling committed Mar 3, 2020
1 parent 28e1da3 commit 4dd4dd2
Showing 1 changed file with 7 additions and 0 deletions.
7 changes: 7 additions & 0 deletions Kernel/Process.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4290,6 +4290,13 @@ int Process::sys$clock_nanosleep(const Syscall::SC_clock_nanosleep_params* user_
if (wakeup_time > g_uptime) {
u32 ticks_left = wakeup_time - g_uptime;
if (!is_absolute && params.remaining_sleep) {
if (!validate_write_typed(params.remaining_sleep)) {
// This can happen because the lock is dropped while
// sleeping, thus giving other threads the opportunity
// to make the region unwritable.
return -EFAULT;
}

timespec remaining_sleep;
memset(&remaining_sleep, 0, sizeof(timespec));
remaining_sleep.tv_sec = ticks_left / TICKS_PER_SECOND;
Expand Down

0 comments on commit 4dd4dd2

Please sign in to comment.