Index: miscfuncs.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/miscfuncs.cc,v retrieving revision 1.41 diff -u -p -r1.41 miscfuncs.cc --- miscfuncs.cc 28 May 2006 15:50:14 -0000 1.41 +++ miscfuncs.cc 26 Jul 2006 22:28:53 -0000 @@ -159,13 +159,8 @@ check_invalid_virtual_addr (const void * return 0; } -static char __attribute__ ((noinline)) -dummytest (volatile char *p) -{ - return *p; -} ssize_t -check_iovec (const struct iovec *iov, int iovcnt, bool forwrite) +check_iovec (const struct iovec *iov, int iovcnt) { if (iovcnt <= 0 || iovcnt > IOV_MAX) { @@ -173,10 +168,6 @@ check_iovec (const struct iovec *iov, in return -1; } - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - size_t tot = 0; while (iovcnt != 0) @@ -187,21 +178,13 @@ check_iovec (const struct iovec *iov, in return -1; } - volatile char *p = ((char *) iov->iov_base) + iov->iov_len - 1; - if (!iov->iov_len) - /* nothing to do */; - else if (!forwrite) - *p = dummytest (p); - else - dummytest (p); - iov++; iovcnt--; } assert (tot <= SSIZE_MAX); - return (ssize_t) tot; + return tot; } UINT Index: net.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/net.cc,v retrieving revision 1.214 diff -u -p -r1.214 net.cc --- net.cc 25 Jul 2006 19:23:23 -0000 1.214 +++ net.cc 26 Jul 2006 22:28:55 -0000 @@ -2068,7 +2068,7 @@ cygwin_recvmsg (int fd, struct msghdr *m res = -1; else { - res = check_iovec_for_read (msg->msg_iov, msg->msg_iovlen); + res = check_iovec (msg->msg_iov, msg->msg_iovlen); if (res > 0) res = fh->recvmsg (msg, flags, res); // res == iovec tot } @@ -2091,7 +2091,7 @@ cygwin_sendmsg (int fd, const struct msg res = -1; else { - res = check_iovec_for_write (msg->msg_iov, msg->msg_iovlen); + res = check_iovec (msg->msg_iov, msg->msg_iovlen); res = fh->sendmsg (msg, flags, res); // res == iovec tot } Index: syscalls.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/syscalls.cc,v retrieving revision 1.404 diff -u -p -r1.404 syscalls.cc --- syscalls.cc 25 Jul 2006 19:23:23 -0000 1.404 +++ syscalls.cc 26 Jul 2006 22:28:55 -0000 @@ -445,7 +445,14 @@ readv (int fd, const struct iovec *const int res = -1; - const ssize_t tot = check_iovec_for_read (iov, iovcnt); + myfault efault; + if (efault.faulted (EFAULT)) + { + res = -1; + goto done; + } + + const ssize_t tot = check_iovec (iov, iovcnt); if (tot <= 0) { @@ -527,11 +534,17 @@ writev (const int fd, const struct iovec { int res = -1; sig_dispatch_pending (); - const ssize_t tot = check_iovec_for_write (iov, iovcnt); cygheap_fdget cfd (fd); - if (cfd < 0) - goto done; + myfault efault; + + if (efault.faulted (EFAULT) || cfd < 0) + { + res = -1; + goto done; + } + + const ssize_t tot = check_iovec (iov, iovcnt); if (tot <= 0) { Index: winsup.h =================================================================== RCS file: /cvs/src/src/winsup/cygwin/winsup.h,v retrieving revision 1.190 diff -u -p -r1.190 winsup.h --- winsup.h 25 Jul 2006 19:23:23 -0000 1.190 +++ winsup.h 26 Jul 2006 22:28:55 -0000 @@ -263,9 +263,7 @@ void init_global_security (); int __stdcall check_invalid_virtual_addr (const void *s, unsigned sz) __attribute__ ((regparm(2))); -ssize_t check_iovec (const struct iovec *, int, bool) __attribute__ ((regparm(3))); -#define check_iovec_for_read(a, b) check_iovec ((a), (b), false) -#define check_iovec_for_write(a, b) check_iovec ((a), (b), true) +ssize_t check_iovec (const struct iovec *, int) __attribute__ ((regparm(2))); #define set_winsock_errno() __set_winsock_errno (__FUNCTION__, __LINE__) void __set_winsock_errno (const char *fn, int ln) __attribute__ ((regparm(2)));