summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/lwp/lwp_syscall.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c
index de147d5f09..f3538c2cb4 100644
--- a/components/lwp/lwp_syscall.c
+++ b/components/lwp/lwp_syscall.c
@@ -970,6 +970,7 @@ sysret_t sys_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptf
#ifdef ARCH_MM_MMU
int ret = -1;
fd_set *kreadfds = RT_NULL, *kwritefds = RT_NULL, *kexceptfds = RT_NULL;
+ struct timeval ktimeout, *ptimeout = RT_NULL;
if (readfds)
{
@@ -1016,8 +1017,18 @@ sysret_t sys_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptf
}
lwp_get_from_user(kexceptfds, exceptfds, sizeof *kexceptfds);
}
+ if (timeout)
+ {
+ if (!lwp_user_accessable((void *)timeout, sizeof *timeout))
+ {
+ SET_ERRNO(EFAULT);
+ goto quit;
+ }
+ lwp_get_from_user(&ktimeout, timeout, sizeof ktimeout);
+ ptimeout = &ktimeout;
+ }
- ret = select(nfds, kreadfds, kwritefds, kexceptfds, timeout);
+ ret = select(nfds, kreadfds, kwritefds, kexceptfds, ptimeout);
if (kreadfds)
{
lwp_put_to_user(readfds, kreadfds, sizeof *kreadfds);