Subject: dead mbufs in ip_input??
To: None <tech-net@netbsd.org>
From: Adolf Hohl <adolf.hohl@security.kpnqwest.com>
List: tech-net
Date: 11/15/2000 14:24:15
Hi,
during my work I recognised, that after an unsuccesfull m_pullup call at
the beginning of ip_input there is only a return instead of mfree.
void
ip_input(struct mbuf *m)
{
struct ip *ip = NULL;
struct ipq *fp;
struct in_ifaddr *ia;
struct ifaddr *ifa;
struct ipqent *ipqe;
int hlen = 0, mff, len;
int downmatch;
#ifdef PFIL_HOOKS
struct packet_filter_hook *pfh;
struct mbuf *m0;
int rv;
#endif /* PFIL_HOOKS */
#ifdef DIAGNOSTIC
if ((m->m_flags & M_PKTHDR) == 0)
panic("ipintr no HDR");
#endif
#ifdef IPSEC
/*
* should the inner packet be considered authentic?
* see comment in ah4_input().
*/
if (m) {
m->m_flags &= ~M_AUTHIPHDR;
m->m_flags &= ~M_AUTHIPDGM;
}
#endif
/*
* If no IP addresses have been set yet but the interfaces
* are receiving, can't do anything with incoming packets yet.
*/
if (in_ifaddr.tqh_first == 0)
goto bad;
ipstat.ips_total++;
if (m->m_len < sizeof (struct ip) &&
(m = m_pullup(m, sizeof (struct ip))) == 0) {
ipstat.ips_toosmall++;
return;
}
ip = mtod(m, struct ip *);
if (ip->ip_v != IPVERSION) {
ipstat.ips_badvers++;
goto bad;
}
hlen = ip->ip_hl << 2;
if (hlen < sizeof(struct ip)) { /* minimum header length */
ipstat.ips_badhlen++;
goto bad;
}
if (hlen > m->m_len) {
if ((m = m_pullup(m, hlen)) == 0) {
ipstat.ips_badhlen++;
return;
}
ip = mtod(m, struct ip *);
}
It doesn't make sense that mbuf-chains remains in memory. Maybe, my guess
isn't true. Any comments are appreciated.