svn commit: r190997 - in stable/7/sys: . contrib/pf
dev/ath/ath_hal dev/cxgb kern
Robert Watson
rwatson at FreeBSD.org
Mon Apr 13 04:56:21 PDT 2009
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;
>
More information about the svn-src-stable-7
mailing list