From: Thomas Graf Date: Mon, 11 Nov 2013 11:11:36 +0000 (+0100) Subject: netlink: Do not enforce alignment of last Netlink attribute X-Git-Tag: v2.1.0~294 X-Git-Url: http://git.cascardo.eti.br/?a=commitdiff_plain;h=b66b7b188a7575c434074e205246df671a35636d;p=cascardo%2Fovs.git netlink: Do not enforce alignment of last Netlink attribute There is no reason to enforce padding after the last attribute. Dropping this enforcement will ease efforts to implement zerocopy upcall. Signed-off-by: Thomas Graf Acked-by: Ben Pfaff Signed-off-by: Jesse Gross --- diff --git a/lib/netlink.h b/lib/netlink.h index 1a1c0de1e..f9234da1b 100644 --- a/lib/netlink.h +++ b/lib/netlink.h @@ -137,14 +137,22 @@ nl_attr_is_valid(const struct nlattr *nla, size_t maxlen) { return (maxlen >= sizeof *nla && nla->nla_len >= sizeof *nla - && NLA_ALIGN(nla->nla_len) <= maxlen); + && nla->nla_len <= maxlen); +} + +static inline size_t +nl_attr_len_pad(const struct nlattr *nla, size_t maxlen) +{ + size_t len = NLA_ALIGN(nla->nla_len); + + return len <= maxlen ? len : nla->nla_len; } /* This macro is careful to check for attributes with bad lengths. */ #define NL_ATTR_FOR_EACH(ITER, LEFT, ATTRS, ATTRS_LEN) \ for ((ITER) = (ATTRS), (LEFT) = (ATTRS_LEN); \ nl_attr_is_valid(ITER, LEFT); \ - (LEFT) -= NLA_ALIGN((ITER)->nla_len), (ITER) = nl_attr_next(ITER)) + (LEFT) -= nl_attr_len_pad(ITER, LEFT), (ITER) = nl_attr_next(ITER)) /* This macro does not check for attributes with bad lengths. It should only @@ -153,7 +161,7 @@ nl_attr_is_valid(const struct nlattr *nla, size_t maxlen) #define NL_ATTR_FOR_EACH_UNSAFE(ITER, LEFT, ATTRS, ATTRS_LEN) \ for ((ITER) = (ATTRS), (LEFT) = (ATTRS_LEN); \ (LEFT) > 0; \ - (LEFT) -= NLA_ALIGN((ITER)->nla_len), (ITER) = nl_attr_next(ITER)) + (LEFT) -= nl_attr_len_pad(ITER, LEFT), (ITER) = nl_attr_next(ITER)) /* These variants are convenient for iterating nested attributes. */ #define NL_NESTED_FOR_EACH(ITER, LEFT, A) \