Kernel: Only restart certain syscalls with SA_RESTART
SA_RESTART is not supposted to restart every function.
This commit is contained in:
parent
3e6a4f2b16
commit
7314cf708c
|
@ -38,6 +38,8 @@ namespace Kernel
|
||||||
#undef O
|
#undef O
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static bool is_restartable_syscall(int syscall);
|
||||||
|
|
||||||
extern "C" long cpp_syscall_handler(int syscall, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5, InterruptStack* interrupt_stack)
|
extern "C" long cpp_syscall_handler(int syscall, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5, InterruptStack* interrupt_stack)
|
||||||
{
|
{
|
||||||
ASSERT(GDT::is_user_segment(interrupt_stack->cs));
|
ASSERT(GDT::is_user_segment(interrupt_stack->cs));
|
||||||
|
@ -93,7 +95,7 @@ namespace Kernel
|
||||||
auto& current_thread = Thread::current();
|
auto& current_thread = Thread::current();
|
||||||
if (current_thread.can_add_signal_to_execute())
|
if (current_thread.can_add_signal_to_execute())
|
||||||
if (current_thread.handle_signal())
|
if (current_thread.handle_signal())
|
||||||
if (ret.is_error() && ret.error().get_error_code() == EINTR)
|
if (ret.is_error() && ret.error().get_error_code() == EINTR && is_restartable_syscall(syscall))
|
||||||
ret = BAN::Error::from_errno(ERESTART);
|
ret = BAN::Error::from_errno(ERESTART);
|
||||||
|
|
||||||
Processor::set_interrupt_state(InterruptState::Disabled);
|
Processor::set_interrupt_state(InterruptState::Disabled);
|
||||||
|
@ -105,4 +107,26 @@ namespace Kernel
|
||||||
return ret.value();
|
return ret.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_restartable_syscall(int syscall)
|
||||||
|
{
|
||||||
|
// https://www.man7.org/linux/man-pages/man7/signal.7.html
|
||||||
|
// Interruption of system calls and library functions by signal handlers
|
||||||
|
switch (syscall)
|
||||||
|
{
|
||||||
|
case SYS_READ:
|
||||||
|
case SYS_WRITE:
|
||||||
|
case SYS_IOCTL:
|
||||||
|
case SYS_OPENAT:
|
||||||
|
case SYS_WAIT:
|
||||||
|
case SYS_ACCEPT:
|
||||||
|
case SYS_CONNECT:
|
||||||
|
case SYS_RECVFROM:
|
||||||
|
case SYS_SENDTO:
|
||||||
|
case SYS_FLOCK:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue