Module Name: src
Committed By: roy
Date: Wed Oct 14 11:22:55 UTC 2015
Modified Files:
src/sys/netinet: if_arp.c
Log Message:
In the event of an error within arpresolve(), delete the cloned route
otherwise it would never be deleted.
To generate a diff of this commit:
cvs rdiff -u -r1.188 -r1.189 src/sys/netinet/if_arp.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/netinet/if_arp.c
diff -u src/sys/netinet/if_arp.c:1.188 src/sys/netinet/if_arp.c:1.189
--- src/sys/netinet/if_arp.c:1.188 Wed Oct 14 11:17:57 2015
+++ src/sys/netinet/if_arp.c Wed Oct 14 11:22:55 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: if_arp.c,v 1.188 2015/10/14 11:17:57 roy Exp $ */
+/* $NetBSD: if_arp.c,v 1.189 2015/10/14 11:22:55 roy Exp $ */
/*-
* Copyright (c) 1998, 2000, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.188 2015/10/14 11:17:57 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.189 2015/10/14 11:22:55 roy Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@@ -840,8 +840,8 @@ notfound:
if (ifp->if_flags & _IFF_NOARP) {
if (la != NULL)
LLE_RUNLOCK(la);
- m_freem(m);
- return ENOTSUP;
+ error = ENOTSUP;
+ goto bad;
}
#undef _IFF_NOARP
if (la == NULL) {
@@ -859,13 +859,13 @@ notfound:
IF_AFDATA_RUNLOCK(ifp);
}
+ error = EINVAL;
if (la == NULL) {
log(LOG_DEBUG,
"%s: failed to %s llentry for %s on %s\n",
__func__, create_lookup, inet_ntoa(satocsin(dst)->sin_addr),
ifp->if_xname);
- m_freem(m);
- return EINVAL;
+ goto bad;
}
/* Just in case */
@@ -875,8 +875,7 @@ notfound:
"%s: valid llentry has no rtentry for %s on %s\n",
__func__, inet_ntoa(satocsin(dst)->sin_addr),
ifp->if_xname);
- m_freem(m);
- return EINVAL;
+ goto bad;
}
rt = la->la_rt;
@@ -917,11 +916,11 @@ notfound:
}
if (la->la_flags & LLE_STATIC) { /* should not happen! */
+ LLE_RUNLOCK(la);
log(LOG_DEBUG, "arpresolve: ouch, empty static llinfo for %s\n",
inet_ntoa(satocsin(dst)->sin_addr));
- m_freem(m);
error = EINVAL;
- goto done;
+ goto bad;
}
renew = (la->la_asked == 0 || la->la_expire != time_uptime);
@@ -983,9 +982,16 @@ notfound:
&satocsin(dst)->sin_addr, enaddr);
return error;
}
-done:
+
LLE_RUNLOCK(la);
+ return error;
+bad:
+ m_freem(m);
+ if (rt != NULL && (rt->rt_flags & RTF_CLONED) != 0) {
+ rtrequest(RTM_DELETE, rt_getkey(rt),
+ rt->rt_gateway, rt_mask(rt), rt->rt_flags, NULL);
+ }
return error;
}