libnl 3 with kernel < 2.6.38

Thomas Graf tgraf at infradead.org
Wed Mar 23 08:43:15 EDT 2011


On Wed, Mar 23, 2011 at 01:03:29PM +0100, Thierry Reding wrote:

> -- Original message: type=0x13 length=36 flags=<REQUEST,ACK> sequence-nr=1009839803 pid=1980
> -- Debug: Sent Message:
> --------------------------   BEGIN NETLINK MESSAGE ---------------------------
>   [HEADER] 16 octets
>     .nlmsg_len = 36
>     .nlmsg_type = 19 <route/link::set>
>     .nlmsg_flags = 5 <REQUEST,ACK>
>     .nlmsg_seq = 1009839804
>     .nlmsg_pid = 1980
>   [PAYLOAD] 16 octets
>     00 00 00 00 04 00 00 00 03 10 00 00 00 00 00 00       ................
>   [ATTR 26] 0 octets
>     ---------------------------  END NETLINK MESSAGE   ---------------------------

Problem is this empty nested atribtue (IFLA_AF_SPEC)

Fixed with the following commit:

commit a0fe7a1c9abe3ab5bf8c9253fab50e114b02b87b
Author: Thomas Graf <tgraf at suug.ch>
Date:   Wed Mar 23 13:39:18 2011 +0100

    Omit empty nested attributes
    
    Check for empty nested attributes in nla_nest_end() and omit the
    attribute alltogether if is is the case.

diff --git a/lib/attr.c b/lib/attr.c
index cccd50d..a045351 100644
--- a/lib/attr.c
+++ b/lib/attr.c
@@ -1151,10 +1151,22 @@ struct nlattr *nla_nest_start(struct nl_msg *msg, int attrtype)
  */
 int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
 {
-       size_t pad;
+       size_t pad, len;
 
-       start->nla_len = (unsigned char *) nlmsg_tail(msg->nm_nlh) -
-                               (unsigned char *) start;
+       len = (void *) nlmsg_tail(msg->nm_nlh) - (void *) start;
+
+       if (len == NLA_HDRLEN) {
+               /*
+                * Kernel can't handle empty nested attributes, trim the
+                * attribute header again
+                */
+               msg->nm_nlh->nlmsg_len -= NLA_HDRLEN;
+               memset(nlmsg_tail(msg->nm_nlh), 0, NLA_HDRLEN);
+
+               return 0;
+       }
+
+       start->nla_len = len;
 
        pad = NLMSG_ALIGN(msg->nm_nlh->nlmsg_len) - msg->nm_nlh->nlmsg_len;
        if (pad > 0) {





More information about the libnl mailing list