The following diff should fix it.

 - todd

Index: sys/miscfs/fifofs/fifo_vnops.c
===================================================================
RCS file: /home/cvs/openbsd/src/sys/miscfs/fifofs/fifo_vnops.c,v
retrieving revision 1.41
diff -u -r1.41 fifo_vnops.c
--- sys/miscfs/fifofs/fifo_vnops.c      14 Sep 2014 14:17:26 -0000      1.41
+++ sys/miscfs/fifofs/fifo_vnops.c      6 Oct 2014 22:51:50 -0000
@@ -147,8 +147,8 @@
                        return (error);
                }
                fip->fi_readers = fip->fi_writers = 0;
+               wso->so_state |= SS_CANTSENDMORE;
                wso->so_snd.sb_lowat = PIPE_BUF;
-               rso->so_state |= SS_CANTRCVMORE;
        }
        if (ap->a_mode & FREAD) {
                fip->fi_readers++;
@@ -287,24 +287,12 @@
 {
        struct vop_poll_args *ap = v;
        struct file filetmp;
-       short ostate;
        int revents = 0;
 
        if (ap->a_events & (POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND)) {
-               /*
-                * Socket and FIFO poll(2) semantics differ wrt EOF on read.
-                * Unlike a normal socket, FIFOs don't care whether or not
-                * SS_CANTRCVMORE is set.  To get the correct semantics we
-                * must clear SS_CANTRCVMORE from so_state temporarily.
-                */
-               ostate = ap->a_vp->v_fifoinfo->fi_readsock->so_state;
-               if (ap->a_events & (POLLIN | POLLRDNORM))
-                       ap->a_vp->v_fifoinfo->fi_readsock->so_state &=
-                           ~SS_CANTRCVMORE;
                filetmp.f_data = ap->a_vp->v_fifoinfo->fi_readsock;
                if (filetmp.f_data)
                        revents |= soo_poll(&filetmp, ap->a_events, ap->a_p);
-               ap->a_vp->v_fifoinfo->fi_readsock->so_state = ostate;
        }
        if (ap->a_events & (POLLOUT | POLLWRNORM | POLLWRBAND)) {
                filetmp.f_data = ap->a_vp->v_fifoinfo->fi_writesock;

Reply via email to