I think this removes some redundancy and a questionable check while being
more straight forward and covering more possible fault cases.  Please let
me know if I missed a reason it had to be that way.

2006-07-26  Brian Ford  <[EMAIL PROTECTED]>

        * miscfuncs.cc (dummytest): Delete.
        (check_iovec): Remove forwrite argument.  Let caller setup fault
        handler and don't explicitly test for valid buffers.
        * winsup.h (check_iovec_for_read): Delete define.
        (check_iovec_for_write): Likewise.
        (check_iovec): Adjust prototype.
        * net.cc (cygwin_recvmsg): Adjust for above.
        (cygwin_sendmsg): Likewise.
        * syscalls.cc (readv): Setup fault handling here and adjust for
        above.
        (writev): Likewise.

-- 
Brian Ford
Lead Realtime Software Engineer
VITAL - Visual Simulation Systems
FlightSafety International
the best safety device in any aircraft is a well-trained crew...
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)));

Reply via email to