summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authorru <ru@FreeBSD.org>2001-12-01 13:48:16 +0000
committerru <ru@FreeBSD.org>2001-12-01 13:48:16 +0000
commit5fcff41f8a2071b3a0e95fe3c7b0290c907407b0 (patch)
tree3d794089377ef4bb74a2f60b5e1862977fee39d2 /sys/netinet
parentb3079d8ae1e568c43dbc59b7822d96301530c0cd (diff)
downloadFreeBSD-src-5fcff41f8a2071b3a0e95fe3c7b0290c907407b0.zip
FreeBSD-src-5fcff41f8a2071b3a0e95fe3c7b0290c907407b0.tar.gz
Allow for ip_output() to be called with a NULL route pointer.
This fixes a panic I introduced yesterday in ip_icmp.c,v 1.64.
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/ip_mroute.c3
-rw-r--r--sys/netinet/ip_output.c10
2 files changed, 7 insertions, 6 deletions
diff --git a/sys/netinet/ip_mroute.c b/sys/netinet/ip_mroute.c
index 254200e..956c466 100644
--- a/sys/netinet/ip_mroute.c
+++ b/sys/netinet/ip_mroute.c
@@ -1867,7 +1867,6 @@ tbf_send_packet(vifp, m)
{
struct ip_moptions imo;
int error;
- static struct route ro;
int s = splnet();
if (vifp->v_flags & VIFF_TUNNEL) {
@@ -1886,7 +1885,7 @@ tbf_send_packet(vifp, m)
* should get rejected because they appear to come from
* the loopback interface, thus preventing looping.
*/
- error = ip_output(m, (struct mbuf *)0, &ro,
+ error = ip_output(m, (struct mbuf *)0, NULL,
IP_FORWARDING, &imo);
if (mrtdebug & DEBUG_XMIT)
diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c
index 304aa4d..ecf0faa 100644
--- a/sys/netinet/ip_output.c
+++ b/sys/netinet/ip_output.c
@@ -123,11 +123,11 @@ ip_output(m0, opt, ro, flags, imo)
struct mbuf *m = m0;
int hlen = sizeof (struct ip);
int len, off, error = 0;
+ struct route iproute;
struct sockaddr_in *dst;
struct in_ifaddr *ia;
int isbroadcast, sw_csum;
#ifdef IPSEC
- struct route iproute;
struct socket *so = NULL;
struct secpolicy *sp = NULL;
#endif
@@ -188,9 +188,6 @@ ip_output(m0, opt, ro, flags, imo)
#ifdef DIAGNOSTIC
if ((m->m_flags & M_PKTHDR) == 0)
panic("ip_output no HDR");
- if (!ro)
- panic("ip_output no route, proto = %d",
- mtod(m, struct ip *)->ip_p);
#endif
if (opt) {
m = ip_insertoptions(m, opt, &len);
@@ -213,6 +210,11 @@ ip_output(m0, opt, ro, flags, imo)
hlen = IP_VHL_HL(ip->ip_vhl) << 2;
}
+ /* Route packet. */
+ if (ro == NULL) {
+ ro = &iproute;
+ bzero(ro, sizeof(*ro));
+ }
dst = (struct sockaddr_in *)&ro->ro_dst;
/*
* If there is a cached route,
OpenPOWER on IntegriCloud