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

Reply via email to