diff --git a/kernel/src/syscall/epoll.rs b/kernel/src/syscall/epoll.rs index 13859db18..aec197e60 100644 --- a/kernel/src/syscall/epoll.rs +++ b/kernel/src/syscall/epoll.rs @@ -14,6 +14,9 @@ use crate::{ process::signal::sig_mask::SigMask, }; +// See: https://elixir.bootlin.com/linux/v6.11.5/source/fs/eventpoll.c#L2437 +const EP_MAX_EVENTS: usize = i32::MAX as usize / core::mem::size_of::(); + pub fn sys_epoll_create(size: i32, ctx: &Context) -> Result { if size <= 0 { return_errno_with_message!(Errno::EINVAL, "size is not positive"); @@ -95,8 +98,8 @@ fn do_epoll_wait( ctx: &Context, ) -> Result> { let max_events = { - if max_events <= 0 { - return_errno_with_message!(Errno::EINVAL, "max_events is not positive"); + if max_events <= 0 || max_events as usize > EP_MAX_EVENTS { + return_errno_with_message!(Errno::EINVAL, "max_events is not valid"); } max_events as usize }; @@ -192,7 +195,7 @@ pub fn sys_epoll_pwait( epfd, events_addr, max_events, timeout, sigmask, sigset_size ); - if sigset_size != 8 { + if sigmask != 0 && sigset_size != 8 { return_errno_with_message!(Errno::EINVAL, "sigset size is not equal to 8"); } diff --git a/test/syscall_test/blocklists/epoll_test b/test/syscall_test/blocklists/epoll_test index 0890177d6..95f695c80 100644 --- a/test/syscall_test/blocklists/epoll_test +++ b/test/syscall_test/blocklists/epoll_test @@ -1,12 +1,6 @@ EpollTest.Timeout_NoRandomSave -EpollTest.TimeoutNoFds -EpollTest.UnblockWithNewFD -EpollTest.Oneshot -EpollTest.EdgeTriggered_NoRandomSave -EpollTest.OneshotAndEdgeTriggered EpollTest.CycleOfOneDisallowed EpollTest.CycleOfThreeDisallowed -EpollTest.CloseFile # `UnblockWithSignal` contains races. Better not to enable it. # See https://github.com/asterinas/asterinas/pull/1035 for details. EpollTest.UnblockWithSignal