summaryrefslogtreecommitdiffstats
path: root/sys/net/if_pflow.c
diff options
context:
space:
mode:
authorgollo <gollo@openbsd.org>2008-09-17 22:18:00 +0000
committergollo <gollo@openbsd.org>2008-09-17 22:18:00 +0000
commit9e200726756ef685140c77f6cb6cb3cd8fe4c5be (patch)
tree2204ae941596f3fd6371e79528734aa1fec9b97f /sys/net/if_pflow.c
parentfix whitespaces (diff)
downloadwireguard-openbsd-9e200726756ef685140c77f6cb6cb3cd8fe4c5be.tar.xz
wireguard-openbsd-9e200726756ef685140c77f6cb6cb3cd8fe4c5be.zip
Solve m_free problem with a not correctly configured pflow interface
leading to a kernel crash reported in PR5930 OK claudio@ henning@
Diffstat (limited to 'sys/net/if_pflow.c')
-rw-r--r--sys/net/if_pflow.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/sys/net/if_pflow.c b/sys/net/if_pflow.c
index 91439b9e18b..418f5e47de8 100644
--- a/sys/net/if_pflow.c
+++ b/sys/net/if_pflow.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_pflow.c,v 1.4 2008/09/17 20:25:41 gollo Exp $ */
+/* $OpenBSD: if_pflow.c,v 1.5 2008/09/17 22:18:00 gollo Exp $ */
/*
* Copyright (c) 2008 Henning Brauer <henning@openbsd.org>
@@ -517,7 +517,7 @@ pflow_timeout(void *v)
int
pflow_sendout(struct pflow_softc *sc)
{
- struct mbuf *m;
+ struct mbuf *m = sc->sc_mbuf;
struct pflow_header *h;
#if NBPFILTER > 0
struct ifnet *ifp = &sc->sc_if;
@@ -525,19 +525,17 @@ pflow_sendout(struct pflow_softc *sc)
timeout_del(&sc->sc_tmo);
- if (sc->sc_mbuf == NULL)
+ if (m == NULL)
return (0);
- pflowstats.pflow_packets++;
-
+ sc->sc_mbuf = NULL;
+ sc->sc_flowp.s = NULL;
if (!(ifp->if_flags & IFF_RUNNING)) {
m_freem(m);
return (0);
}
- m = sc->sc_mbuf;
- sc->sc_mbuf = NULL;
- sc->sc_flowp.s = NULL;
+ pflowstats.pflow_packets++;
h = mtod(m, struct pflow_header *);
h->count = htons(sc->sc_count);