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) {
>