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); > }