summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Pieuchot <mpi@cvs.openbsd.org>2016-08-15 07:03:48 +0000
committerMartin Pieuchot <mpi@cvs.openbsd.org>2016-08-15 07:03:48 +0000
commit8e6ac4559d87dc19f95707fb5370777cfb4bd382 (patch)
treeaee757998eb991243d8bc8d3011350ccaf9da91a
parent944f9acec028c87dfe6b5b041678e8c962a2434b (diff)
Merge bpfilter_create() into bpfopen() and make it such that the
descriptor is referenced before it is inserted in the global list. ok dlg@
-rw-r--r--sys/net/bpf.c36
1 files changed, 13 insertions, 23 deletions
diff --git a/sys/net/bpf.c b/sys/net/bpf.c
index 4e435406345..09746aedcfe 100644
--- a/sys/net/bpf.c
+++ b/sys/net/bpf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bpf.c,v 1.143 2016/07/25 13:19:32 natano Exp $ */
+/* $OpenBSD: bpf.c,v 1.144 2016/08/15 07:03:47 mpi Exp $ */
/* $NetBSD: bpf.c,v 1.33 1997/02/21 23:59:35 thorpej Exp $ */
/*
@@ -116,7 +116,6 @@ int filt_bpfread(struct knote *, long);
int bpf_sysctl_locked(int *, u_int, void *, size_t *, void *, size_t);
struct bpf_d *bpfilter_lookup(int);
-struct bpf_d *bpfilter_create(int);
/*
* Reference count access to descriptor buffers
@@ -331,23 +330,28 @@ bpfilterattach(int n)
int
bpfopen(dev_t dev, int flag, int mode, struct proc *p)
{
- struct bpf_d *d;
+ struct bpf_d *bd;
+ int unit = minor(dev);
- if (minor(dev) & ((1 << CLONE_SHIFT) - 1))
+ if (unit & ((1 << CLONE_SHIFT) - 1))
return (ENXIO);
+ KASSERT(bpfilter_lookup(unit) == NULL);
+
/* create on demand */
- if ((d = bpfilter_create(minor(dev))) == NULL)
+ if ((bd = malloc(sizeof(*bd), M_DEVBUF, M_NOWAIT|M_ZERO)) == NULL)
return (EBUSY);
/* Mark "free" and do most initialization. */
- d->bd_bufsize = bpf_bufsize;
- d->bd_sig = SIGIO;
+ bd->bd_unit = unit;
+ bd->bd_bufsize = bpf_bufsize;
+ bd->bd_sig = SIGIO;
if (flag & FNONBLOCK)
- d->bd_rtout = -1;
+ bd->bd_rtout = -1;
- D_GET(d);
+ D_GET(bd);
+ LIST_INSERT_HEAD(&bpf_d_list, bd, bd_list);
return (0);
}
@@ -1625,20 +1629,6 @@ bpfilter_lookup(int unit)
return (NULL);
}
-struct bpf_d *
-bpfilter_create(int unit)
-{
- struct bpf_d *bd;
-
- KASSERT(bpfilter_lookup(unit) == NULL);
-
- if ((bd = malloc(sizeof(*bd), M_DEVBUF, M_NOWAIT|M_ZERO)) != NULL) {
- bd->bd_unit = unit;
- LIST_INSERT_HEAD(&bpf_d_list, bd, bd_list);
- }
- return (bd);
-}
-
/*
* Get a list of available data link type of the interface.
*/