diff options
| author | Conrad Meyer <cem@FreeBSD.org> | 2016-04-26 23:13:48 +0000 |
|---|---|---|
| committer | Conrad Meyer <cem@FreeBSD.org> | 2016-04-26 23:13:48 +0000 |
| commit | 2769d062039cf2742d966a788af2d018eda6d994 (patch) | |
| tree | 5687c4eef4b609858412ee7f9fb9d84a21ed8269 /sys/netinet | |
| parent | 349ef43de4f7d7af2f83a35e62c67cf894b6fb31 (diff) | |
Notes
Diffstat (limited to 'sys/netinet')
| -rw-r--r-- | sys/netinet/in.c | 19 |
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; |
