On Fri, 4 Dec 2015, Todd C. Miller wrote:
> On Fri, 04 Dec 2015 09:47:46 -0800, Philip Guenther wrote:
> > We should fix open(2); please try the diff below.  Are you sure pppx
> > is affected?  pppxioctl()'s FIONBIO case appears to be a no-op.  I
> > certainly agree that bpf and tun are affected.
> 
> Shouldn't the device open function check for FNONBLOCK and handle
> it as needed?

Finally got back to this; this diff should fix open(O_NONBLOCK) of bpf, 
tun, and tap devices.  The bikeshed question is whether this should use 
O_NONBLOCK or FNONBLOCK...

ok?


Index: net/bpf.c
===================================================================
RCS file: /data/src/openbsd/src/sys/net/bpf.c,v
retrieving revision 1.131
diff -u -p -r1.131 bpf.c
--- net/bpf.c   5 Dec 2015 10:07:55 -0000       1.131
+++ net/bpf.c   1 Jan 2016 18:47:42 -0000
@@ -341,6 +341,9 @@ bpfopen(dev_t dev, int flag, int mode, s
        d->bd_bufsize = bpf_bufsize;
        d->bd_sig = SIGIO;
 
+       if (flag & O_NONBLOCK)
+               d->bd_rtout = -1;
+
        D_GET(d);
 
        return (0);
Index: net/if_tun.c
===================================================================
RCS file: /data/src/openbsd/src/sys/net/if_tun.c,v
retrieving revision 1.164
diff -u -p -r1.164 if_tun.c
--- net/if_tun.c        5 Dec 2015 16:09:09 -0000       1.164
+++ net/if_tun.c        1 Jan 2016 18:47:30 -0000
@@ -361,6 +361,8 @@ tun_dev_open(struct tun_softc *tp, int f
 
        ifp = &tp->tun_if;
        tp->tun_flags |= TUN_OPEN;
+       if (flag & O_NONBLOCK)
+               tp->tun_flags |= TUN_NBIO;
 
        /* automatically mark the interface running on open */
        s = splnet();

Reply via email to