To apply:
   cd /usr/src/sys/kern
   patch -p0 < uio.patch

readv/writev with iov_len == 0 is legal

Index: uipc_syscalls.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v
retrieving revision 1.14
diff -u -r1.14 uipc_syscalls.c
--- uipc_syscalls.c     1999/02/11 05:33:09     1.14
+++ uipc_syscalls.c     1999/02/14 18:37:13
@@ -439,8 +439,8 @@
       iov = mp->msg_iov;
       for (i = 0; i < mp->msg_iovlen; i++, iov++) {
               /* Don't allow sum > SSIZE_MAX */
-               if ((ssize_t)(auio.uio_resid += iov->iov_len) <= 0 &&
-                   (iov->iov_base != 0 || iov->iov_len != 0))
+               if (iov->iov_len > SSIZE_MAX ||
+                   (auio.uio_resid += iov->iov_len) > SSIZE_MAX)
                       return (EINVAL);
       }
       if (mp->msg_name) {
@@ -630,8 +630,8 @@
       iov = mp->msg_iov;
       for (i = 0; i < mp->msg_iovlen; i++, iov++) {
               /* Don't allow sum > SSIZE_MAX */
-               if ((ssize_t)(auio.uio_resid += iov->iov_len) <= 0 &&
-                   (iov->iov_base != 0 || iov->iov_len != 0))
+               if (iov->iov_len > SSIZE_MAX ||
+                   (auio.uio_resid += iov->iov_len) > SSIZE_MAX)
                       return (EINVAL);
       }
#ifdef KTRACE
Index: sys_generic.c
===================================================================
RCS file: /cvs/src/sys/kern/sys_generic.c,v
retrieving revision 1.15
diff -u -r1.15 sys_generic.c
--- sys_generic.c       1998/07/28 22:36:42     1.15
+++ sys_generic.c       1999/02/14 18:30:39
@@ -182,7 +182,8 @@
       auio.uio_resid = 0;
       for (i = 0; i < SCARG(uap, iovcnt); i++, iov++) {
               /* Don't allow sum > SSIZE_MAX */
-               if ((ssize_t)(auio.uio_resid += iov->iov_len) <= 0) {
+               if (iov->iov_len > SSIZE_MAX ||
+                   (auio.uio_resid += iov->iov_len) > SSIZE_MAX) {
                       error = EINVAL;
                       goto done;
               }
@@ -336,7 +337,8 @@
       auio.uio_resid = 0;
       for (i = 0; i < SCARG(uap, iovcnt); i++, iov++) {
               /* Don't allow sum > SSIZE_MAX */
-               if ((ssize_t)(auio.uio_resid += iov->iov_len) <= 0) {
+               if (iov->iov_len > SSIZE_MAX ||
+                   (auio.uio_resid += iov->iov_len) > SSIZE_MAX) {
                       error = EINVAL;
                       goto done;
               }