aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/ndp
diff options
context:
space:
mode:
authorKristof Provost <kp@FreeBSD.org>2023-10-16 09:48:57 +0000
committerKristof Provost <kp@FreeBSD.org>2023-10-17 06:47:52 +0000
commit4f8f43b06ed07e96a250855488cc531799d5b78f (patch)
tree9402884797d1657c76c28bfa5d14a784ae97461a /usr.sbin/ndp
parentfad5734995e3fba428ce5e4131389c4fff0610ab (diff)
downloadsrc-4f8f43b06ed07e96a250855488cc531799d5b78f.tar.gz
src-4f8f43b06ed07e96a250855488cc531799d5b78f.zip
netlink: cope with growing requests
If a request ends up growing beyong the initially allocated space the netlink functions (such as snl_add_msg_attr_u32()) will allocate a new buffer. This invalidates the header pointer we can have received from snl_create_msg_request(). Always use the hdr returned by snl_finalize_msg(). Reviewed by: melifaro MFC after: 1 week Sponsored by: Rubicon Communications, LLC ("Netgate") Differential Revision: https://reviews.freebsd.org/D42223
Diffstat (limited to 'usr.sbin/ndp')
-rw-r--r--usr.sbin/ndp/ndp_netlink.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/usr.sbin/ndp/ndp_netlink.c b/usr.sbin/ndp/ndp_netlink.c
index 954d16995b5a..79bdec2356d0 100644
--- a/usr.sbin/ndp/ndp_netlink.c
+++ b/usr.sbin/ndp/ndp_netlink.c
@@ -76,7 +76,7 @@ get_link_info(struct snl_state *ss, uint32_t ifindex,
struct ifinfomsg *ifmsg = snl_reserve_msg_object(&nw, struct ifinfomsg);
if (ifmsg != NULL)
ifmsg->ifi_index = ifindex;
- if (!snl_finalize_msg(&nw) || !snl_send_message(ss, hdr))
+ if (! (hdr = snl_finalize_msg(&nw)) || !snl_send_message(ss, hdr))
return (false);
hdr = snl_read_reply(ss, hdr->nlmsg_seq);
@@ -152,7 +152,7 @@ guess_ifindex(struct snl_state *ss, uint32_t fibnum, const struct sockaddr_in6 *
snl_add_msg_attr_ip(&nw, RTA_DST, (struct sockaddr *)dst);
snl_add_msg_attr_u32(&nw, RTA_TABLE, fibnum);
- if (!snl_finalize_msg(&nw) || !snl_send_message(ss, hdr))
+ if (! (hdr = snl_finalize_msg(&nw)) || !snl_send_message(ss, hdr))
return (0);
hdr = snl_read_reply(ss, hdr->nlmsg_seq);
@@ -184,7 +184,7 @@ guess_ifindex(struct snl_state *ss, uint32_t fibnum, const struct sockaddr_in6 *
snl_add_msg_attr_u32(&nw, NHAF_TABLE, fibnum);
snl_end_attr_nested(&nw, off);
- if (!snl_finalize_msg(&nw) || !snl_send_message(ss, hdr))
+ if (! (hdr = snl_finalize_msg(&nw)) || !snl_send_message(ss, hdr))
return (0);
hdr = snl_read_reply(ss, hdr->nlmsg_seq);
@@ -327,7 +327,7 @@ print_entries_nl(uint32_t ifindex, struct sockaddr_in6 *addr, bool cflag)
ndmsg->ndm_ifindex = ifindex;
}
- if (!snl_finalize_msg(&nw) || !snl_send_message(&ss_req, hdr)) {
+ if (! (hdr = snl_finalize_msg(&nw)) || !snl_send_message(&ss_req, hdr)) {
snl_free(&ss_req);
return (0);
}
@@ -421,7 +421,7 @@ delete_nl(uint32_t ifindex, char *host)
}
snl_add_msg_attr_ip(&nw, NDA_DST, (struct sockaddr *)&dst);
- if (!snl_finalize_msg(&nw) || !snl_send_message(&ss, hdr)) {
+ if (! (hdr = snl_finalize_msg(&nw)) || !snl_send_message(&ss, hdr)) {
snl_free(&ss);
return (1);
}
@@ -493,7 +493,7 @@ set_nl(uint32_t ifindex, struct sockaddr_in6 *dst, struct sockaddr_dl *sdl, char
snl_add_msg_attr_ip(&nw, NDA_DST, (struct sockaddr *)dst);
snl_add_msg_attr(&nw, NDA_LLADDR, sdl->sdl_alen, LLADDR(sdl));
- if (!snl_finalize_msg(&nw) || !snl_send_message(&ss, hdr)) {
+ if (! (hdr = snl_finalize_msg(&nw)) || !snl_send_message(&ss, hdr)) {
snl_free(&ss);
return (1);
}