On Tue, Sep 20, 2016 at 03:16:50PM +0200, Alexander Bluhm wrote: > On Tue, Sep 20, 2016 at 08:21:55AM -0400, David Hill wrote: > > With bluhm's r1.160 uipc_socket.c. > > Here are the first ones that were detected. > > Thanks for the fast report. > > So fifo works around the socket layer. Better call soconnect2() > instead of unp_connect2(). This adds the missing splsoftnet(). > > I think we should demand that socantsendmore() and socantrcvmore() > in uipc_socket2.c should be called with splsoftnet().
Should both socantsendmore() and socantrcvmore() get a splsoftassert() then, for now? > > ok? > > bluhm > > Index: miscfs/fifofs/fifo_vnops.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/miscfs/fifofs/fifo_vnops.c,v > retrieving revision 1.51 > diff -u -p -r1.51 fifo_vnops.c > --- miscfs/fifofs/fifo_vnops.c 7 Jun 2016 06:12:37 -0000 1.51 > +++ miscfs/fifofs/fifo_vnops.c 20 Sep 2016 13:04:56 -0000 > @@ -48,7 +48,6 @@ > #include <sys/errno.h> > #include <sys/malloc.h> > #include <sys/poll.h> > -#include <sys/unpcb.h> > #include <sys/unistd.h> > > #include <miscfs/fifofs/fifo.h> > @@ -143,7 +142,7 @@ fifo_open(void *v) > return (error); > } > fip->fi_writesock = wso; > - if ((error = unp_connect2(wso, rso)) != 0) { > + if ((error = soconnect2(wso, rso)) != 0) { > (void)soclose(wso); > (void)soclose(rso); > free(fip, M_VNODE, sizeof *fip); > @@ -350,20 +349,25 @@ fifo_close(void *v) > struct vop_close_args *ap = v; > struct vnode *vp = ap->a_vp; > struct fifoinfo *fip = vp->v_fifoinfo; > - int error1 = 0, error2 = 0; > + int s, error1 = 0, error2 = 0; > > if (fip == NULL) > return (0); > > if (ap->a_fflag & FREAD) { > - if (--fip->fi_readers == 0) > + if (--fip->fi_readers == 0) { > + s = splsoftnet(); > socantsendmore(fip->fi_writesock); > + splx(s); > + } > } > if (ap->a_fflag & FWRITE) { > if (--fip->fi_writers == 0) { > + s = splsoftnet(); > /* SS_ISDISCONNECTED will result in POLLHUP */ > fip->fi_readsock->so_state |= SS_ISDISCONNECTED; > socantrcvmore(fip->fi_readsock); > + splx(s); > } > } > if (fip->fi_readers == 0 && fip->fi_writers == 0) { >