git: 6380058fe5b5 - main - netlink: use correct uint16_t type for attribute type & length
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 03 Dec 2024 20:05:00 UTC
The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=6380058fe5b5573ce2eb1a077d95ac9328e19334 commit 6380058fe5b5573ce2eb1a077d95ac9328e19334 Author: Gleb Smirnoff <glebius@FreeBSD.org> AuthorDate: 2024-12-03 20:04:30 +0000 Commit: Gleb Smirnoff <glebius@FreeBSD.org> CommitDate: 2024-12-03 20:04:30 +0000 netlink: use correct uint16_t type for attribute type & length Reviewed by: melifaro Differential Revision: https://reviews.freebsd.org/D47552 --- sys/netlink/netlink_message_writer.c | 8 ++++++-- sys/netlink/netlink_message_writer.h | 38 +++++++++++++++++++----------------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/sys/netlink/netlink_message_writer.c b/sys/netlink/netlink_message_writer.c index 092e3798f8e7..1aebc4690c2d 100644 --- a/sys/netlink/netlink_message_writer.c +++ b/sys/netlink/netlink_message_writer.c @@ -363,11 +363,15 @@ nlmsg_reserve_data_raw(struct nl_writer *nw, size_t sz) } bool -nlattr_add(struct nl_writer *nw, int attr_type, int attr_len, const void *data) +nlattr_add(struct nl_writer *nw, uint16_t attr_type, uint16_t attr_len, + const void *data) { struct nl_buf *nb = nw->buf; struct nlattr *nla; - u_int required_len; + size_t required_len; + + KASSERT(attr_len <= UINT16_MAX - sizeof(struct nlattr), + ("%s: invalid attribute length %u", __func__, attr_len)); required_len = NLA_ALIGN(attr_len + sizeof(struct nlattr)); if (__predict_false(nb->datalen + required_len > nb->buflen)) { diff --git a/sys/netlink/netlink_message_writer.h b/sys/netlink/netlink_message_writer.h index 9469883feaa7..1655acb53fef 100644 --- a/sys/netlink/netlink_message_writer.h +++ b/sys/netlink/netlink_message_writer.h @@ -214,93 +214,95 @@ _nlmsg_reserve_attr(struct nl_writer *nw, uint16_t nla_type, uint16_t sz) } #define nlmsg_reserve_attr(_ns, _at, _t) ((_t *)_nlmsg_reserve_attr(_ns, _at, NLA_ALIGN(sizeof(_t)))) -bool nlattr_add(struct nl_writer *nw, int attr_type, int attr_len, +bool nlattr_add(struct nl_writer *nw, uint16_t attr_type, uint16_t attr_len, const void *data); static inline bool nlattr_add_raw(struct nl_writer *nw, const struct nlattr *nla_src) { - int attr_len = nla_src->nla_len - sizeof(struct nlattr); + MPASS(nla_src->nla_len >= sizeof(struct nlattr)); - MPASS(attr_len >= 0); - - return (nlattr_add(nw, nla_src->nla_type, attr_len, (const void *)(nla_src + 1))); + return (nlattr_add(nw, nla_src->nla_type, + nla_src->nla_len - sizeof(struct nlattr), + (const void *)(nla_src + 1))); } static inline bool -nlattr_add_bool(struct nl_writer *nw, int attrtype, bool value) +nlattr_add_bool(struct nl_writer *nw, uint16_t attrtype, bool value) { return (nlattr_add(nw, attrtype, sizeof(bool), &value)); } static inline bool -nlattr_add_u8(struct nl_writer *nw, int attrtype, uint8_t value) +nlattr_add_u8(struct nl_writer *nw, uint16_t attrtype, uint8_t value) { return (nlattr_add(nw, attrtype, sizeof(uint8_t), &value)); } static inline bool -nlattr_add_u16(struct nl_writer *nw, int attrtype, uint16_t value) +nlattr_add_u16(struct nl_writer *nw, uint16_t attrtype, uint16_t value) { return (nlattr_add(nw, attrtype, sizeof(uint16_t), &value)); } static inline bool -nlattr_add_u32(struct nl_writer *nw, int attrtype, uint32_t value) +nlattr_add_u32(struct nl_writer *nw, uint16_t attrtype, uint32_t value) { return (nlattr_add(nw, attrtype, sizeof(uint32_t), &value)); } static inline bool -nlattr_add_u64(struct nl_writer *nw, int attrtype, uint64_t value) +nlattr_add_u64(struct nl_writer *nw, uint16_t attrtype, uint64_t value) { return (nlattr_add(nw, attrtype, sizeof(uint64_t), &value)); } static inline bool -nlattr_add_s8(struct nl_writer *nw, int attrtype, int8_t value) +nlattr_add_s8(struct nl_writer *nw, uint16_t attrtype, int8_t value) { return (nlattr_add(nw, attrtype, sizeof(int8_t), &value)); } static inline bool -nlattr_add_s16(struct nl_writer *nw, int attrtype, int16_t value) +nlattr_add_s16(struct nl_writer *nw, uint16_t attrtype, int16_t value) { return (nlattr_add(nw, attrtype, sizeof(int16_t), &value)); } static inline bool -nlattr_add_s32(struct nl_writer *nw, int attrtype, int32_t value) +nlattr_add_s32(struct nl_writer *nw, uint16_t attrtype, int32_t value) { return (nlattr_add(nw, attrtype, sizeof(int32_t), &value)); } static inline bool -nlattr_add_s64(struct nl_writer *nw, int attrtype, int64_t value) +nlattr_add_s64(struct nl_writer *nw, uint16_t attrtype, int64_t value) { return (nlattr_add(nw, attrtype, sizeof(int64_t), &value)); } static inline bool -nlattr_add_flag(struct nl_writer *nw, int attrtype) +nlattr_add_flag(struct nl_writer *nw, uint16_t attrtype) { return (nlattr_add(nw, attrtype, 0, NULL)); } static inline bool -nlattr_add_string(struct nl_writer *nw, int attrtype, const char *str) +nlattr_add_string(struct nl_writer *nw, uint16_t attrtype, const char *str) { return (nlattr_add(nw, attrtype, strlen(str) + 1, str)); } static inline bool -nlattr_add_in_addr(struct nl_writer *nw, int attrtype, const struct in_addr *in) +nlattr_add_in_addr(struct nl_writer *nw, uint16_t attrtype, + const struct in_addr *in) { return (nlattr_add(nw, attrtype, sizeof(*in), in)); } static inline bool -nlattr_add_in6_addr(struct nl_writer *nw, int attrtype, const struct in6_addr *in6) +nlattr_add_in6_addr(struct nl_writer *nw, uint16_t attrtype, + const struct in6_addr *in6) { return (nlattr_add(nw, attrtype, sizeof(*in6), in6)); }