aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet/ip_options.c
diff options
context:
space:
mode:
authorRobert Watson <rwatson@FreeBSD.org>2009-06-23 20:19:09 +0000
committerRobert Watson <rwatson@FreeBSD.org>2009-06-23 20:19:09 +0000
commit8c0fec805f76bef04e007ca08552bd80ab64daf9 (patch)
tree5ce1a7dad67026f119a839b3325454ebafa72c51 /sys/netinet/ip_options.c
parentabcd328be6335621a1152ed2ce08b4550ab4242c (diff)
Notes
Diffstat (limited to 'sys/netinet/ip_options.c')
-rw-r--r--sys/netinet/ip_options.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/netinet/ip_options.c b/sys/netinet/ip_options.c
index b59d708c6d42..09a1d6279202 100644
--- a/sys/netinet/ip_options.c
+++ b/sys/netinet/ip_options.c
@@ -164,9 +164,8 @@ ip_dooptions(struct mbuf *m, int pass)
goto bad;
}
ipaddr.sin_addr = ip->ip_dst;
- ia = (struct in_ifaddr *)
- ifa_ifwithaddr((struct sockaddr *)&ipaddr);
- if (ia == NULL) {
+ if (ifa_ifwithaddr_check((struct sockaddr *)&ipaddr)
+ == 0) {
if (opt == IPOPT_SSRR) {
type = ICMP_UNREACH;
code = ICMP_UNREACH_SRCFAIL;
@@ -245,6 +244,7 @@ dropit:
ip->ip_dst = ipaddr.sin_addr;
(void)memcpy(cp + off, &(IA_SIN(ia)->sin_addr),
sizeof(struct in_addr));
+ ifa_free(&ia->ia_ifa);
cp[IPOPT_OFFSET] += sizeof(struct in_addr);
/*
* Let ip_intr's mcast routing check handle mcast pkts
@@ -286,6 +286,7 @@ dropit:
}
(void)memcpy(cp + off, &(IA_SIN(ia)->sin_addr),
sizeof(struct in_addr));
+ ifa_free(&ia->ia_ifa);
cp[IPOPT_OFFSET] += sizeof(struct in_addr);
break;
@@ -331,6 +332,7 @@ dropit:
continue;
(void)memcpy(sin, &IA_SIN(ia)->sin_addr,
sizeof(struct in_addr));
+ ifa_free(&ia->ia_ifa);
cp[IPOPT_OFFSET] += sizeof(struct in_addr);
off += sizeof(struct in_addr);
break;