]> granicus.if.org Git - libnl/commitdiff
lib: merge implementations of nl_attr_end() and nl_attr_keep_empty()
authorThomas Haller <thaller@redhat.com>
Mon, 12 Feb 2018 13:10:18 +0000 (14:10 +0100)
committerThomas Haller <thaller@redhat.com>
Mon, 12 Feb 2018 13:17:11 +0000 (14:17 +0100)
Both functions are almost identical. Merge them into a common helper
function with an @keep_empty argument, so it is clear at which point
they differ.

Also, fix symbols versioning for nl_attr_keep_empty(). For symbol
versioning, once released a version cannot be modifified/extended.

lib/attr.c
libnl-3.sym

index d90fa47988f073fba5c5aa83ed622ef72fd4b469..0928630b2f96c1141c687debdc71c79bb4408c01 100644 (file)
@@ -912,22 +912,14 @@ struct nlattr *nla_nest_start(struct nl_msg *msg, int attrtype)
        return start;
 }
 
-/**
- * Finalize nesting of attributes.
- * @arg msg            Netlink message.
- * @arg start          Container attribute as returned from nla_nest_start().
- *
- * Corrects the container attribute header to include the appeneded attributes.
- *
- * @return 0 on success or a negative error code.
- */
-int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
+static int _nest_end(struct nl_msg *msg, struct nlattr *start, int keep_empty)
 {
        size_t pad, len;
 
        len = (void *) nlmsg_tail(msg->nm_nlh) - (void *) start;
 
-       if (len == NLA_HDRLEN || len > USHRT_MAX) {
+       if (   len > USHRT_MAX
+           || (!keep_empty && len == NLA_HDRLEN)) {
                /*
                 * Max nlattr size exceeded or empty nested attribute, trim the
                 * attribute header again
@@ -961,6 +953,20 @@ int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
        return 0;
 }
 
+/**
+ * Finalize nesting of attributes.
+ * @arg msg            Netlink message.
+ * @arg start          Container attribute as returned from nla_nest_start().
+ *
+ * Corrects the container attribute header to include the appeneded attributes.
+ *
+ * @return 0 on success or a negative error code.
+ */
+int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
+{
+       return _nest_end (msg, start, 0);
+}
+
 /**
  * Finalize nesting of attributes without stripping off empty attributes.
  * @arg msg            Netlink message.
@@ -973,41 +979,7 @@ int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
  */
 int nla_nest_end_keep_empty(struct nl_msg *msg, struct nlattr *start)
 {
-       size_t pad, len;
-
-       len = (void *) nlmsg_tail(msg->nm_nlh) - (void *) start;
-
-       if (len > USHRT_MAX) {
-               /*
-                * Max nlattr size is exceeded, trim the attribute header again
-                */
-               nla_nest_cancel(msg, start);
-
-               /* Return error only if nlattr size was exceeded */
-               return -NLE_ATTRSIZE;
-       }
-
-       start->nla_len = len;
-
-       pad = NLMSG_ALIGN(msg->nm_nlh->nlmsg_len) - msg->nm_nlh->nlmsg_len;
-       if (pad > 0) {
-               /*
-                * Data inside attribute does not end at a alignment boundry.
-                * Pad accordingly and accoun for the additional space in
-                * the message. nlmsg_reserve() may never fail in this situation,
-                * the allocate message buffer must be a multiple of NLMSG_ALIGNTO.
-                */
-               if (!nlmsg_reserve(msg, pad, 0))
-                       BUG();
-
-               NL_DBG(2, "msg %p: attr <%p> %d: added %zu bytes of padding\n",
-                       msg, start, start->nla_type, pad);
-       }
-
-       NL_DBG(2, "msg %p: attr <%p> %d: closing nesting, len=%u\n",
-               msg, start, start->nla_type, start->nla_len);
-
-       return 0;
+       return _nest_end (msg, start, 1);
 }
 
 /**
index 42b38b7be68175953dbab1e1c31e05a4a84cc3a0..82d2f0724d872c264c4600fda00e628f1716581e 100644 (file)
@@ -260,7 +260,6 @@ global:
        nla_memcpy;
        nla_nest_cancel;
        nla_nest_end;
-       nla_nest_end_keep_empty;
        nla_nest_start;
        nla_next;
        nla_ok;
@@ -359,3 +358,8 @@ global:
        nl_cache_mngr_add_cache_v2;
        nl_strerror_l;
 } libnl_3_2_28;
+
+libnl_3_5 {
+global:
+       nla_nest_end_keep_empty;
+} libnl_3_2_29;