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:
Mike Silbersack 2003-10-19 22:33:41 +00:00
parent 0513e13e31
commit 5d5b5d0f99
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=121260
2 changed files with 8 additions and 0 deletions

View file

@ -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)

View file

@ -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.