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