Add the M_FREELIST flag, which is used to detect whenever a

double free of a mbuf occurs and cause an immediate panic, rather
than allowing free list corruption to occur.

This code is trapped under INVARIANTS, so it should not cause any
change in default performance.

Reviewed by:	a bunch of people on -net
MFC after:	1 week
This commit is contained in:
Mike Silbersack 2003-05-02 03:43:40 +00:00
parent 4f7c7f6e23
commit d563b41e1f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=114488
2 changed files with 11 additions and 0 deletions

View File

@ -1380,6 +1380,11 @@ m_free(struct mbuf *mb)
int cchnum;
short persist = 0;
#ifdef INVARIANTS
if (mb->m_flags & M_FREELIST)
panic("m_free detected a mbuf double-free");
mb->m_flags |= M_FREELIST;
#endif
if ((mb->m_flags & M_PKTHDR) != 0)
m_tag_delete_chain(mb, NULL);
nb = mb->m_next;
@ -1422,6 +1427,11 @@ m_freem(struct mbuf *mb)
short persist;
while (mb != NULL) {
#ifdef INVARIANTS
if (mb->m_flags & M_FREELIST)
panic("m_freem detected a mbuf double-free");
mb->m_flags |= M_FREELIST;
#endif
if ((mb->m_flags & M_PKTHDR) != 0)
m_tag_delete_chain(mb, NULL);
persist = 0;

View File

@ -153,6 +153,7 @@ struct mbuf {
#define M_PROTO3 0x0040 /* protocol-specific */
#define M_PROTO4 0x0080 /* protocol-specific */
#define M_PROTO5 0x0100 /* protocol-specific */
#define M_FREELIST 0x4000 /* mbuf is on the free list */
/*
* mbuf pkthdr flags (also stored in m_flags).