Since m_pullup() can return a new mbuf, change gre_input2() to

return mbuf back to gre_input(). If the former returns mbuf back
to the latter, then pass it to raw_input().

Coverity ID:	829
This commit is contained in:
Gleb Smirnoff 2006-05-16 11:15:22 +00:00
parent ffb761f624
commit e5f88c4492

View File

@ -95,7 +95,7 @@ void gre_inet_ntoa(struct in_addr in); /* XXX */
static struct gre_softc *gre_lookup(struct mbuf *, u_int8_t);
static int gre_input2(struct mbuf *, int, u_char);
static struct mbuf *gre_input2(struct mbuf *, int, u_char);
/*
* De-encapsulate a packet and feed it back through ip input (this
@ -106,29 +106,27 @@ static int gre_input2(struct mbuf *, int, u_char);
void
gre_input(struct mbuf *m, int off)
{
int ret, proto;
int proto;
proto = (mtod(m, struct ip *))->ip_p;
ret = gre_input2(m, off, proto);
m = gre_input2(m, off, proto);
/*
* ret == 0 : packet not processed, meaning that
* no matching tunnel that is up is found.
* we inject it to raw ip socket to see if anyone picks it up.
* If no matching tunnel that is up is found. We inject
* the mbuf to raw ip socket to see if anyone picks it up.
*/
if (ret == 0)
if (m != NULL)
rip_input(m, off);
}
/*
* decapsulate.
* Does the real work and is called from gre_input() (above)
* returns 0 if packet is not yet processed
* and 1 if it needs no further processing
* proto is the protocol number of the "calling" foo_input()
* routine.
* Decapsulate. Does the real work and is called from gre_input()
* (above). Returns an mbuf back if packet is not yet processed,
* and NULL if it needs no further processing. proto is the protocol
* number of the "calling" foo_input() routine.
*/
static int
static struct mbuf *
gre_input2(struct mbuf *m ,int hlen, u_char proto)
{
struct greip *gip;
@ -139,13 +137,13 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto)
if ((sc = gre_lookup(m, proto)) == NULL) {
/* No matching tunnel or tunnel is down. */
return (0);
return (m);
}
if (m->m_len < sizeof(*gip)) {
m = m_pullup(m, sizeof(*gip));
if (m == NULL)
return (ENOBUFS);
return (NULL);
}
gip = mtod(m, struct greip *);
@ -164,7 +162,7 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto)
hlen += 4;
/* We don't support routing fields (variable length) */
if (flags & GRE_RP)
return (0);
return (m);
if (flags & GRE_KP)
hlen += 4;
if (flags & GRE_SP)
@ -191,18 +189,19 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto)
af = AF_APPLETALK;
break;
#endif
default: /* others not yet supported */
return (0);
default:
/* Others not yet supported. */
return (m);
}
break;
default:
/* others not yet supported */
return (0);
/* Others not yet supported. */
return (m);
}
if (hlen > m->m_pkthdr.len) {
m_freem(m);
return (EINVAL);
return (NULL);
}
/* Unlike NetBSD, in FreeBSD m_adj() adjusts m->m_pkthdr.len as well */
m_adj(m, hlen);
@ -215,7 +214,8 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto)
netisr_dispatch(isr, m);
return (1); /* packet is done, no further processing needed */
/* Packet is done, no further processing needed. */
return (NULL);
}
/*