summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhenning <henning@openbsd.org>2007-09-26 13:09:59 +0000
committerhenning <henning@openbsd.org>2007-09-26 13:09:59 +0000
commitfca085108fc99e04641f1363ff23ceb7b583dd17 (patch)
tree07e0e650ba91964fc7e2fc3f56acb1074c8fccca
parentprovide m_inithdr(), which takes an mbuf and gives an initialized M_PKTHDR (diff)
downloadwireguard-openbsd-fca085108fc99e04641f1363ff23ceb7b583dd17.tar.xz
wireguard-openbsd-fca085108fc99e04641f1363ff23ceb7b583dd17.zip
ep(4) is totally weird. due to hardware design limitations it plays
wierd games with caching mbufs. as part of that it used regular mbufs and makes them M_PKTHDR mbufs on the fly, instead of calling m_gethdr. of course it did it hackish and wrong and did not properly initialize the pkthdr fields, which stated to cause problems as soon as we started to stuff more into the packet header. so use the freshly introduced m_inithdr() to make the mbuf a pktdr mbuf. problem found + analyzed by janjaap@stack.nl PR5563, input theo, ok claudio
-rw-r--r--sys/dev/ic/elink3.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/sys/dev/ic/elink3.c b/sys/dev/ic/elink3.c
index a377a9e5fca..09de8d648a5 100644
--- a/sys/dev/ic/elink3.c
+++ b/sys/dev/ic/elink3.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: elink3.c,v 1.69 2007/01/19 01:33:44 krw Exp $ */
+/* $OpenBSD: elink3.c,v 1.70 2007/09/26 13:09:59 henning Exp $ */
/* $NetBSD: elink3.c,v 1.32 1997/05/14 00:22:00 thorpej Exp $ */
/*
@@ -1389,10 +1389,7 @@ epget(sc, totlen)
timeout_add(&sc->sc_epmbuffill_tmo, 1);
/* Convert one of our saved mbuf's. */
sc->next_mb = (sc->next_mb + 1) % MAX_MBS;
- m->m_data = m->m_pktdat;
- m->m_flags = M_PKTHDR;
- m_tag_init(m);
- m->m_pkthdr.csum_flags = 0;
+ m = m_inithdr(m);
}
m->m_pkthdr.rcvif = ifp;
m->m_pkthdr.len = totlen;