On Mon, Jun 26, 2017 at 04:09:30PM +0200, Martin Pieuchot wrote:
> This is similar to the socket & kqueue diff I just sent.
>
> Check for NOTE_SUBMIT hint in order to protect `so_state', `so_snd'
> and `so_rcv'.
>
> ok?
OK bluhm@
>
> Index: miscfs//fifofs/fifo_vnops.c
> ===================================================================
> RCS file: /cvs/src/sys/miscfs/fifofs/fifo_vnops.c,v
> retrieving revision 1.54
> diff -u -p -r1.54 fifo_vnops.c
> --- miscfs//fifofs/fifo_vnops.c 26 Jun 2017 09:32:31 -0000 1.54
> +++ miscfs//fifofs/fifo_vnops.c 26 Jun 2017 14:07:29 -0000
> @@ -527,14 +527,22 @@ int
> filt_fiforead(struct knote *kn, long hint)
> {
> struct socket *so = (struct socket *)kn->kn_hook;
> + int s, rv;
>
> + if (!(hint & NOTE_SUBMIT))
> + s = solock(so);
> kn->kn_data = so->so_rcv.sb_cc;
> if (so->so_state & SS_CANTRCVMORE) {
> kn->kn_flags |= EV_EOF;
> - return (1);
> + rv = 1;
> + } else {
> + kn->kn_flags &= ~EV_EOF;
> + rv = (kn->kn_data > 0);
> }
> - kn->kn_flags &= ~EV_EOF;
> - return (kn->kn_data > 0);
> + if (!(hint & NOTE_SUBMIT))
> + sounlock(s);
> +
> + return (rv);
> }
>
> void
> @@ -551,12 +559,20 @@ int
> filt_fifowrite(struct knote *kn, long hint)
> {
> struct socket *so = (struct socket *)kn->kn_hook;
> + int s, rv;
>
> + if (!(hint & NOTE_SUBMIT))
> + s = solock(so);
> kn->kn_data = sbspace(so, &so->so_snd);
> if (so->so_state & SS_CANTSENDMORE) {
> kn->kn_flags |= EV_EOF;
> - return (1);
> + rv = 1;
> + } else {
> + kn->kn_flags &= ~EV_EOF;
> + rv = (kn->kn_data >= so->so_snd.sb_lowat);
> }
> - kn->kn_flags &= ~EV_EOF;
> - return (kn->kn_data >= so->so_snd.sb_lowat);
> + if (!(hint & NOTE_SUBMIT))
> + sounlock(s);
> +
> + return (rv);
> }