On Mon, 13 Apr 2009, Robert Watson wrote:

Author: rwatson
Date: Mon Apr 13 11:54:22 2009
New Revision: 190997
URL: http://svn.freebsd.org/changeset/base/190997

Log:
 Merge r190996 from head to stable/7:

Due to a clerical error, this is not the right revision number. The actual merged revision is r189708.

Robert N M Watson
Computer Laboratory
University of Cambridge


   When writing out updated pollfd records when returning from
   poll(), only copy out the revents field, not the whole pollfd
   structure.  Otherwise, if the events field is updated
   concurrently by another thread, that update may be lost.

   This issue apparently causes problems for the JDK on FreeBSD,
   which expects the Linux behavior of not updating all fields
   (somewhat oddly, Solaris does not implement the required
   behavior, but presumably our adaptation of the JDK is based
   on the Linux port?).

   MFC after:      2 weeks
   PR:             kern/130924
   Submitted by:   Kurt Miller <kurt @ intricatesoftware.com>
   Discussed with: kib

 Approved by:   re (kib)

Modified:
 stable/7/sys/   (props changed)
 stable/7/sys/contrib/pf/   (props changed)
 stable/7/sys/dev/ath/ath_hal/   (props changed)
 stable/7/sys/dev/cxgb/   (props changed)
 stable/7/sys/kern/sys_generic.c

Modified: stable/7/sys/kern/sys_generic.c
==============================================================================
--- stable/7/sys/kern/sys_generic.c     Mon Apr 13 10:41:41 2009        
(r190996)
+++ stable/7/sys/kern/sys_generic.c     Mon Apr 13 11:54:22 2009        
(r190997)
@@ -73,6 +73,7 @@ static MALLOC_DEFINE(M_IOCTLOPS, "ioctlo
static MALLOC_DEFINE(M_SELECT, "select", "select() buffer");
MALLOC_DEFINE(M_IOV, "iov", "large iov's");

+static int     pollout(struct pollfd *, struct pollfd *, u_int);
static int      pollscan(struct thread *, struct pollfd *, u_int);
static int      selscan(struct thread *, fd_mask **, fd_mask **, int);
static int      dofileread(struct thread *, int, struct file *, struct uio *,
@@ -992,7 +993,7 @@ done_nosellock:
        if (error == EWOULDBLOCK)
                error = 0;
        if (error == 0) {
-               error = copyout(bits, uap->fds, ni);
+               error = pollout(bits, uap->fds, nfds);
                if (error)
                        goto out;
        }
@@ -1004,6 +1005,26 @@ done2:
}

static int
+pollout(fds, ufds, nfd)
+       struct pollfd *fds;
+       struct pollfd *ufds;
+       u_int nfd;
+{
+       int error = 0;
+       u_int i = 0;
+
+       for (i = 0; i < nfd; i++) {
+               error = copyout(&fds->revents, &ufds->revents,
+                   sizeof(ufds->revents));
+               if (error)
+                       return (error);
+               fds++;
+               ufds++;
+       }
+       return (0);
+}
+
+static int
pollscan(td, fds, nfd)
        struct thread *td;
        struct pollfd *fds;

_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to