Skip to content
Browse files

attr: Add nla_nest_cancel() to remove partially added nested attributes

Signed-off-by: Thomas Graf <tgraf@suug.ch>
  • Loading branch information...
1 parent 4d7680c commit 9e6cdbf6fc60f95e232c4ca34004606da9536d01 @tgraf committed Mar 13, 2013
Showing with 25 additions and 2 deletions.
  1. +1 −0 doc/core.txt
  2. +1 −0 include/netlink/attr.h
  3. +23 −2 lib/attr.c
View
1 doc/core.txt
@@ -2316,6 +2316,7 @@ int put_opts(struct nl_msg *msg)
return 0;
nla_put_failure:
+ nla_nest_cancel(msg, opts);
return -EMSGSIZE;
}
--------
View
1 include/netlink/attr.h
@@ -124,6 +124,7 @@ extern int nla_put_msecs(struct nl_msg *, int, unsigned long);
extern int nla_put_nested(struct nl_msg *, int, struct nl_msg *);
extern struct nlattr * nla_nest_start(struct nl_msg *, int);
extern int nla_nest_end(struct nl_msg *, struct nlattr *);
+extern void nla_nest_cancel(struct nl_msg *, struct nlattr *);
extern int nla_parse_nested(struct nlattr **, int, struct nlattr *,
struct nla_policy *);
extern int nla_is_nested(struct nlattr *);
View
25 lib/attr.c
@@ -820,8 +820,7 @@ int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
* 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);
+ nla_nest_cancel(msg, start);
return 0;
}
@@ -850,6 +849,28 @@ int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
}
/**
+ * Cancel the addition of a nested attribute
+ * @arg msg Netlink message
+ * @arg attr Nested netlink attribute
+ *
+ * Removes any partially added nested Netlink attribute from the message
+ * by resetting the message to the size before the call to nla_nest_start()
+ * and by overwriting any potentially touched message segments with 0.
+ */
+void nla_nest_cancel(struct nl_msg *msg, struct nlattr *attr)
+{
+ ssize_t len;
+
+ len = (void *) nlmsg_tail(msg->nm_nlh) - (void *) attr;
+ if (len < 0)
+ BUG();
+ else if (len > 0) {
+ msg->nm_nlh->nlmsg_len -= len;
+ memset(nlmsg_tail(msg->nm_nlh), 0, len);
+ }
+}
+
+/**
* Create attribute index based on nested attribute
* @arg tb Index array to be filled (maxtype+1 elements).
* @arg maxtype Maximum attribute type expected and accepted.

0 comments on commit 9e6cdbf

Please sign in to comment.
Something went wrong with that request. Please try again.