Module: xenomai-head Branch: master Commit: 86333965a4362f8439822ec9d22b0a84b5701141 URL: http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=86333965a4362f8439822ec9d22b0a84b5701141
Author: Jan Kiszka <jan.kis...@siemens.com> Date: Fri May 8 01:21:34 2009 +0200 posix: Improve access checks in select Add missing range checks for select parameters and refactor the code. Signed-off-by: Jan Kiszka <jan.kis...@siemens.com> --- ksrc/skins/posix/syscall.c | 18 +++++++++++------- 1 files changed, 11 insertions(+), 7 deletions(-) diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c index c7950a6..ec0c102 100644 --- a/ksrc/skins/posix/syscall.c +++ b/ksrc/skins/posix/syscall.c @@ -2345,15 +2345,17 @@ static int __select(struct pt_regs *regs) struct timeval tv; pthread_t thread; int i, err, nfds; + size_t fds_size; thread = pse51_current_thread(); if (!thread) return -EPERM; if (__xn_reg_arg5(regs)) { - if (__xn_copy_from_user(&tv, - (void __user *)__xn_reg_arg5(regs), - sizeof(tv))) + if (!access_wok((void __user *)__xn_reg_arg5(regs), sizeof(tv)) + || __xn_copy_from_user(&tv, + (void __user *)__xn_reg_arg5(regs), + sizeof(tv))) return -EFAULT; if (tv.tv_usec > 1000000) @@ -2364,15 +2366,17 @@ static int __select(struct pt_regs *regs) } nfds = __xn_reg_arg1(regs); + fds_size = __FDELT(nfds + __NFDBITS - 1) * sizeof(long); for (i = 0; i < XNSELECT_MAX_TYPES; i++) if (ufd_sets[i]) { in_fds[i] = &in_fds_storage[i]; out_fds[i] = & out_fds_storage[i]; - if (__xn_copy_from_user(in_fds[i], - (void __user *) ufd_sets[i], - __FDELT(nfds + __NFDBITS - 1) - * sizeof(long))) + if (!access_wok((void __user *) ufd_sets[i], + sizeof(fd_set)) + || __xn_copy_from_user(in_fds[i], + (void __user *) ufd_sets[i], + fds_size)) return -EFAULT; } _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git