aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorConrad Meyer <cem@FreeBSD.org>2016-04-26 23:13:48 +0000
committerConrad Meyer <cem@FreeBSD.org>2016-04-26 23:13:48 +0000
commit2769d062039cf2742d966a788af2d018eda6d994 (patch)
tree5687c4eef4b609858412ee7f9fb9d84a21ed8269 /sys/netinet
parent349ef43de4f7d7af2f83a35e62c67cf894b6fb31 (diff)
Notes
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/in.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index 80b14483654a..11b140d91ab9 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -1004,6 +1004,17 @@ struct in_llentry {
/*
* Do actual deallocation of @lle.
+ */
+static void
+in_lltable_destroy_lle_unlocked(struct llentry *lle)
+{
+
+ LLE_LOCK_DESTROY(lle);
+ LLE_REQ_DESTROY(lle);
+ free(lle, M_LLTABLE);
+}
+
+/*
* Called by LLE_FREE_LOCKED when number of references
* drops to zero.
*/
@@ -1012,9 +1023,7 @@ in_lltable_destroy_lle(struct llentry *lle)
{
LLE_WUNLOCK(lle);
- LLE_LOCK_DESTROY(lle);
- LLE_REQ_DESTROY(lle);
- free(lle, M_LLTABLE);
+ in_lltable_destroy_lle_unlocked(lle);
}
static struct llentry *
@@ -1277,8 +1286,10 @@ in_lltable_alloc(struct lltable *llt, u_int flags, const struct sockaddr *l3addr
if ((flags & LLE_IFADDR) == LLE_IFADDR) {
linkhdrsize = LLE_MAX_LINKHDR;
if (lltable_calc_llheader(ifp, AF_INET, IF_LLADDR(ifp),
- linkhdr, &linkhdrsize, &lladdr_off) != 0)
+ linkhdr, &linkhdrsize, &lladdr_off) != 0) {
+ in_lltable_destroy_lle_unlocked(lle);
return (NULL);
+ }
lltable_set_entry_addr(ifp, lle, linkhdr, linkhdrsize,
lladdr_off);
lle->la_flags |= LLE_STATIC;