From 44f1072a9ddf9ad33a1fe76bae3d16f4a818ea79 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 3 Jul 2021 06:53:08 +0900 Subject: [PATCH] sd-netlink: determine header size of genl message by using CTRL_ATTR_HDRSIZE attribute Fortunately, all genl families we currently use do not require additional header size. --- src/libsystemd/sd-netlink/netlink-genl.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/libsystemd/sd-netlink/netlink-genl.c b/src/libsystemd/sd-netlink/netlink-genl.c index f454dbd8373..8537e13316c 100644 --- a/src/libsystemd/sd-netlink/netlink-genl.c +++ b/src/libsystemd/sd-netlink/netlink-genl.c @@ -17,6 +17,7 @@ typedef struct GenericNetlinkFamily { uint16_t id; /* a.k.a nlmsg_type */ char *name; uint32_t version; + uint32_t additional_header_size; } GenericNetlinkFamily; static const GenericNetlinkFamily nlctrl_static = { @@ -119,6 +120,10 @@ static int genl_family_new( if (r < 0) return r; + r = sd_netlink_message_read_u32(message, CTRL_ATTR_HDRSIZE, &f->additional_header_size); + if (r < 0) + return r; + r = hashmap_ensure_put(&nl->genl_family_by_id, NULL, UINT_TO_PTR(f->id), f); if (r < 0) return r; @@ -165,7 +170,8 @@ static int genl_message_new( if (r < 0) return r; - r = message_new_full(nl, family->id, type_system, sizeof(struct genlmsghdr), &m); + r = message_new_full(nl, family->id, type_system, + sizeof(struct genlmsghdr) + family->additional_header_size, &m); if (r < 0) return r; @@ -287,7 +293,7 @@ int genl_get_type_system_and_header_size( return r; } if (ret_header_size) - *ret_header_size = sizeof(struct genlmsghdr); + *ret_header_size = sizeof(struct genlmsghdr) + f->additional_header_size; return 0; } -- 2.47.3