From 735a3d73b710513a180cd4a7232a49cf837484d1 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 15 Feb 2021 09:15:06 +0900 Subject: [PATCH 1/3] netlink: fix assertions --- src/libsystemd/sd-netlink/rtnl-message.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/libsystemd/sd-netlink/rtnl-message.c b/src/libsystemd/sd-netlink/rtnl-message.c index ea97b1e6ad..bd51fac47a 100644 --- a/src/libsystemd/sd-netlink/rtnl-message.c +++ b/src/libsystemd/sd-netlink/rtnl-message.c @@ -294,8 +294,19 @@ int sd_rtnl_message_new_nexthop(sd_netlink *rtnl, sd_netlink_message **ret, int r; assert_return(rtnl_message_type_is_nexthop(nhmsg_type), -EINVAL); - assert_return((nhmsg_type == RTM_GETNEXTHOP && nh_family == AF_UNSPEC) || - IN_SET(nh_family, AF_INET, AF_INET6), -EINVAL); + switch(nhmsg_type) { + case RTM_DELNEXTHOP: + assert_return(nh_family == AF_UNSPEC, -EINVAL); + _fallthrough_; + case RTM_GETNEXTHOP: + assert_return(nh_protocol == RTPROT_UNSPEC, -EINVAL); + break; + case RTM_NEWNEXTHOP: + assert_return(IN_SET(nh_family, AF_UNSPEC, AF_INET, AF_INET6), -EINVAL); + break; + default: + assert_not_reached("Invalid message type."); + } assert_return(ret, -EINVAL); r = message_new(rtnl, ret, nhmsg_type); @@ -319,7 +330,7 @@ int sd_rtnl_message_nexthop_set_flags(sd_netlink_message *m, uint8_t flags) { assert_return(m, -EINVAL); assert_return(m->hdr, -EINVAL); - assert_return(rtnl_message_type_is_nexthop(m->hdr->nlmsg_type), -EINVAL); + assert_return(m->hdr->nlmsg_type == RTM_NEWNEXTHOP, -EINVAL); nhm = NLMSG_DATA(m->hdr); nhm->nh_flags |= flags; @@ -346,7 +357,7 @@ int sd_rtnl_message_nexthop_get_family(const sd_netlink_message *m, uint8_t *fam assert_return(m->hdr, -EINVAL); nhm = NLMSG_DATA(m->hdr); - *family = nhm->nh_family ; + *family = nhm->nh_family; return 0; } From fc80ed5f976c6d148d4c3da1dad1bc9484f2a654 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 17 Feb 2021 02:05:28 +0900 Subject: [PATCH 2/3] network: drop unnecessary family setting It is already set in sd_rtnl_message_new_nexthop(). --- src/network/networkd-nexthop.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c index ab0562e9e8..6143de11f3 100644 --- a/src/network/networkd-nexthop.c +++ b/src/network/networkd-nexthop.c @@ -281,10 +281,6 @@ static int nexthop_configure(NextHop *nexthop, Link *link) { r = netlink_message_append_in_addr_union(req, NHA_GATEWAY, nexthop->family, &nexthop->gw); if (r < 0) return log_link_error_errno(link, r, "Could not append NHA_GATEWAY attribute: %m"); - - r = sd_rtnl_message_nexthop_set_family(req, nexthop->family); - if (r < 0) - return log_link_error_errno(link, r, "Could not set nexthop family: %m"); } r = netlink_call_async(link->manager->rtnl, NULL, req, nexthop_handler, From 8900c05e6e8601a101b86111a8ea78453b6fcf12 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 15 Feb 2021 09:21:24 +0900 Subject: [PATCH 3/3] netlink: drop sd_rtnl_message_{route,nexthop}_set_family() The family is already set when the message is created. --- src/libsystemd/sd-netlink/rtnl-message.c | 26 ------------------------ src/systemd/sd-netlink.h | 15 +++++--------- 2 files changed, 5 insertions(+), 36 deletions(-) diff --git a/src/libsystemd/sd-netlink/rtnl-message.c b/src/libsystemd/sd-netlink/rtnl-message.c index bd51fac47a..b8c11d1181 100644 --- a/src/libsystemd/sd-netlink/rtnl-message.c +++ b/src/libsystemd/sd-netlink/rtnl-message.c @@ -125,20 +125,6 @@ int sd_rtnl_message_route_get_family(const sd_netlink_message *m, int *family) { return 0; } -int sd_rtnl_message_route_set_family(sd_netlink_message *m, int family) { - struct rtmsg *rtm; - - assert_return(m, -EINVAL); - assert_return(m->hdr, -EINVAL); - assert_return(rtnl_message_type_is_route(m->hdr->nlmsg_type), -EINVAL); - - rtm = NLMSG_DATA(m->hdr); - - rtm->rtm_family = family; - - return 0; -} - int sd_rtnl_message_route_get_type(const sd_netlink_message *m, unsigned char *type) { struct rtmsg *rtm; @@ -338,18 +324,6 @@ int sd_rtnl_message_nexthop_set_flags(sd_netlink_message *m, uint8_t flags) { return 0; } -int sd_rtnl_message_nexthop_set_family(sd_netlink_message *m, uint8_t family) { - struct nhmsg *nhm; - - assert_return(m, -EINVAL); - assert_return(m->hdr, -EINVAL); - - nhm = NLMSG_DATA(m->hdr); - nhm->nh_family = family; - - return 0; -} - int sd_rtnl_message_nexthop_get_family(const sd_netlink_message *m, uint8_t *family) { struct nhmsg *nhm; diff --git a/src/systemd/sd-netlink.h b/src/systemd/sd-netlink.h index 13b00d6a5b..65d590c5b7 100644 --- a/src/systemd/sd-netlink.h +++ b/src/systemd/sd-netlink.h @@ -138,15 +138,10 @@ int sd_netlink_message_set_flags(sd_netlink_message *m, uint16_t flags); int sd_netlink_message_is_broadcast(const sd_netlink_message *m); /* rtnl */ - -int sd_rtnl_message_new_link(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index); -int sd_rtnl_message_new_addr_update(sd_netlink *nl, sd_netlink_message **ret, int index, int family); -int sd_rtnl_message_new_addr(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index, int family); -int sd_rtnl_message_new_route(sd_netlink *nl, sd_netlink_message **ret, uint16_t nlmsg_type, int rtm_family, unsigned char rtm_protocol); -int sd_rtnl_message_new_neigh(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index, int nda_family); - int sd_rtnl_message_get_family(const sd_netlink_message *m, int *family); +int sd_rtnl_message_new_addr(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index, int family); +int sd_rtnl_message_new_addr_update(sd_netlink *nl, sd_netlink_message **ret, int index, int family); int sd_rtnl_message_addr_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen); int sd_rtnl_message_addr_set_scope(sd_netlink_message *m, unsigned char scope); int sd_rtnl_message_addr_set_flags(sd_netlink_message *m, unsigned char flags); @@ -156,6 +151,7 @@ int sd_rtnl_message_addr_get_scope(const sd_netlink_message *m, unsigned char *s int sd_rtnl_message_addr_get_flags(const sd_netlink_message *m, unsigned char *flags); int sd_rtnl_message_addr_get_ifindex(const sd_netlink_message *m, int *ifindex); +int sd_rtnl_message_new_link(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index); int sd_rtnl_message_link_set_flags(sd_netlink_message *m, unsigned flags, unsigned change); int sd_rtnl_message_link_set_type(sd_netlink_message *m, unsigned type); int sd_rtnl_message_link_set_family(sd_netlink_message *m, unsigned family); @@ -163,6 +159,7 @@ int sd_rtnl_message_link_get_ifindex(const sd_netlink_message *m, int *ifindex); int sd_rtnl_message_link_get_flags(const sd_netlink_message *m, unsigned *flags); int sd_rtnl_message_link_get_type(const sd_netlink_message *m, unsigned short *type); +int sd_rtnl_message_new_route(sd_netlink *nl, sd_netlink_message **ret, uint16_t nlmsg_type, int rtm_family, unsigned char rtm_protocol); int sd_rtnl_message_route_set_dst_prefixlen(sd_netlink_message *m, unsigned char prefixlen); int sd_rtnl_message_route_set_src_prefixlen(sd_netlink_message *m, unsigned char prefixlen); int sd_rtnl_message_route_set_scope(sd_netlink_message *m, unsigned char scope); @@ -171,7 +168,6 @@ int sd_rtnl_message_route_set_table(sd_netlink_message *m, unsigned char table); int sd_rtnl_message_route_set_type(sd_netlink_message *m, unsigned char type); int sd_rtnl_message_route_get_flags(const sd_netlink_message *m, unsigned *flags); int sd_rtnl_message_route_get_family(const sd_netlink_message *m, int *family); -int sd_rtnl_message_route_set_family(sd_netlink_message *m, int family); int sd_rtnl_message_route_get_protocol(const sd_netlink_message *m, unsigned char *protocol); int sd_rtnl_message_route_get_scope(const sd_netlink_message *m, unsigned char *scope); int sd_rtnl_message_route_get_tos(const sd_netlink_message *m, unsigned char *tos); @@ -181,11 +177,10 @@ int sd_rtnl_message_route_get_src_prefixlen(const sd_netlink_message *m, unsigne int sd_rtnl_message_route_get_type(const sd_netlink_message *m, unsigned char *type); int sd_rtnl_message_new_nexthop(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nhmsg_type, int nh_family, unsigned char nh_protocol); - int sd_rtnl_message_nexthop_set_flags(sd_netlink_message *m, uint8_t flags); -int sd_rtnl_message_nexthop_set_family(sd_netlink_message *m, uint8_t family); int sd_rtnl_message_nexthop_get_family(const sd_netlink_message *m, uint8_t *family); +int sd_rtnl_message_new_neigh(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index, int nda_family); int sd_rtnl_message_neigh_set_flags(sd_netlink_message *m, uint8_t flags); int sd_rtnl_message_neigh_set_state(sd_netlink_message *m, uint16_t state); int sd_rtnl_message_neigh_get_family(const sd_netlink_message *m, int *family);