Add a new macro M_ASSERTVALID which ensures that the mbuf in question
is non-free. (More checks can/should be added in the future.) Use M_ASSERTVALID in BPF_MTAP so that we catch when freed mbufs are passed in, even if no bpf listeners are active. Inspired by a bug in if_dc caught by Kenjiro Cho.
This commit is contained in:
parent
0513e13e31
commit
5d5b5d0f99
@ -366,6 +366,7 @@ u_int bpf_filter(const struct bpf_insn *, u_char *, u_int, u_int);
|
||||
bpf_tap((_ifp)->if_bpf, (_pkt), (_pktlen)); \
|
||||
} while (0)
|
||||
#define BPF_MTAP(_ifp,_m) do { \
|
||||
M_ASSERTVALID(_m); \
|
||||
if ((_ifp)->if_bpf) \
|
||||
bpf_mtap((_ifp)->if_bpf, (_m)); \
|
||||
} while (0)
|
||||
|
@ -339,6 +339,13 @@ struct mbstat {
|
||||
KASSERT(m != NULL && m->m_flags & M_PKTHDR, \
|
||||
("%s: no mbuf packet header!", __func__))
|
||||
|
||||
/*
|
||||
* Ensure that the supplied mbuf is a valid, non-free mbuf.
|
||||
*/
|
||||
#define M_ASSERTVALID(m) \
|
||||
KASSERT((((struct mbuf *)m)->m_flags & M_FREELIST) == 0, \
|
||||
("%s: attempted use of a free mbuf!", __func__))
|
||||
|
||||
/*
|
||||
* Set the m_data pointer of a newly-allocated mbuf (m_get/MGET) to place
|
||||
* an object of the specified size at the end of the mbuf, longword aligned.
|
||||
|
Loading…
Reference in New Issue
Block a user