summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/network/networkd-neighbor.c37
1 files changed, 7 insertions, 30 deletions
diff --git a/src/network/networkd-neighbor.c b/src/network/networkd-neighbor.c
index 7539d28076..b33f560b79 100644
--- a/src/network/networkd-neighbor.c
+++ b/src/network/networkd-neighbor.c
@@ -437,36 +437,9 @@ int link_drop_neighbors(Link *link) {
return r;
}
-static int manager_rtnl_process_neighbor_lladdr(sd_netlink_message *message, union lladdr_union *lladdr, size_t *size) {
- int r;
-
- assert(message);
- assert(lladdr);
- assert(size);
-
- r = sd_netlink_message_read(message, NDA_LLADDR, sizeof(lladdr->ip.in6), &lladdr->ip.in6);
- if (r >= 0) {
- *size = sizeof(lladdr->ip.in6);
- return r;
- }
-
- r = sd_netlink_message_read(message, NDA_LLADDR, sizeof(lladdr->mac), &lladdr->mac);
- if (r >= 0) {
- *size = sizeof(lladdr->mac);
- return r;
- }
-
- r = sd_netlink_message_read(message, NDA_LLADDR, sizeof(lladdr->ip.in), &lladdr->ip.in);
- if (r >= 0) {
- *size = sizeof(lladdr->ip.in);
- return r;
- }
-
- return r;
-}
-
int manager_rtnl_process_neighbor(sd_netlink *rtnl, sd_netlink_message *message, Manager *m) {
_cleanup_(neighbor_freep) Neighbor *tmp = NULL;
+ _cleanup_free_ void *lladdr = NULL;
Neighbor *neighbor = NULL;
uint16_t type, state;
int ifindex, r;
@@ -536,11 +509,15 @@ int manager_rtnl_process_neighbor(sd_netlink *rtnl, sd_netlink_message *message,
return 0;
}
- r = manager_rtnl_process_neighbor_lladdr(message, &tmp->lladdr, &tmp->lladdr_size);
+ r = sd_netlink_message_read_data(message, NDA_LLADDR, &tmp->lladdr_size, &lladdr);
if (r < 0) {
- log_link_warning_errno(link, r, "rtnl: received neighbor message with invalid lladdr, ignoring: %m");
+ log_link_warning_errno(link, r, "rtnl: received neighbor message without valid lladdr, ignoring: %m");
+ return 0;
+ } else if (!IN_SET(tmp->lladdr_size, sizeof(struct ether_addr), sizeof(struct in_addr), sizeof(struct in6_addr))) {
+ log_link_warning(link, "rtnl: received neighbor message with invalid lladdr size (%zu), ignoring: %m", tmp->lladdr_size);
return 0;
}
+ memcpy(&tmp->lladdr, lladdr, tmp->lladdr_size);
(void) neighbor_get(link, tmp, &neighbor);