summaryrefslogtreecommitdiff
path: root/sys/netlink
diff options
context:
space:
mode:
authorR. Christian McDonald <rcm@rcm.sh>2023-10-23 11:23:55 +0000
committerKristof Provost <kp@FreeBSD.org>2023-11-01 09:05:49 +0000
commiteff832ae7b248c499464cad93c365a1594715e07 (patch)
treedb9f0623a7a77e3137f9278bab76c417871c197c /sys/netlink
parent7523a37f68ec31b9268d0efe93c5920add3ad8c0 (diff)
Diffstat (limited to 'sys/netlink')
-rw-r--r--sys/netlink/route/neigh.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/sys/netlink/route/neigh.c b/sys/netlink/route/neigh.c
index 9914e7febf57..5be0c1f9d91f 100644
--- a/sys/netlink/route/neigh.c
+++ b/sys/netlink/route/neigh.c
@@ -436,17 +436,18 @@ rtnl_handle_newneigh(struct nlmsghdr *hdr, struct nlpcb *nlp, struct nl_pstate *
struct llentry *lle_tmp = lla_lookup(llt, LLE_EXCLUSIVE, attrs.nda_dst);
if (lle_tmp != NULL) {
error = EEXIST;
- if (hdr->nlmsg_flags & NLM_F_EXCL) {
- LLE_WUNLOCK(lle_tmp);
- lle_tmp = NULL;
- } else if (hdr->nlmsg_flags & NLM_F_REPLACE) {
+ if (hdr->nlmsg_flags & NLM_F_REPLACE) {
+ error = EPERM;
if ((lle_tmp->la_flags & LLE_IFADDR) == 0) {
+ error = 0; /* success */
lltable_unlink_entry(llt, lle_tmp);
+ llentry_free(lle_tmp);
+ lle_tmp = NULL;
lltable_link_entry(llt, lle);
- error = 0;
- } else
- error = EPERM;
+ }
}
+ if (lle_tmp)
+ LLE_WUNLOCK(lle_tmp);
} else {
if (hdr->nlmsg_flags & NLM_F_CREATE)
lltable_link_entry(llt, lle);
@@ -456,14 +457,11 @@ rtnl_handle_newneigh(struct nlmsghdr *hdr, struct nlpcb *nlp, struct nl_pstate *
IF_AFDATA_WUNLOCK(attrs.nda_ifp);
if (error != 0) {
- if (lle != NULL)
- llentry_free(lle);
+ /* throw away the newly allocated llentry */
+ llentry_free(lle);
return (error);
}
- if (lle_tmp != NULL)
- llentry_free(lle_tmp);
-
/* XXX: We're inside epoch */
EVENTHANDLER_INVOKE(lle_event, lle, LLENTRY_RESOLVED);
LLE_WUNLOCK(lle);