summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2023-12-01 16:53:58 (GMT)
committerThomas Haller <thaller@redhat.com>2023-12-01 18:55:56 (GMT)
commita06c8f76c2ea13793150642600ea14841e92e0aa (patch)
tree96b63f4d4171eb31388693d008b6f0fb521c84d9 /include
parent7912b4f90668afab9b7cb7054434d341826b8c54 (diff)
downloadlibnl-a06c8f76c2ea13793150642600ea14841e92e0aa.zip
libnl-a06c8f76c2ea13793150642600ea14841e92e0aa.tar.gz
libnl-a06c8f76c2ea13793150642600ea14841e92e0aa.tar.bz2
route/cls: add get/take wrappers for rtnl_act_append()
rtnl_act_append() either takes ownership of the argument, or does nothing (on error). This pattern is hard to get right. In the past, there were various bugs at this place. Add two wrappers _rtnl_act_append_get() and _rtnl_act_append_take() which consistently don't take ownership of the pointer or take it. Also, in functions like rtnl_flower_append_action() only set the mask after successfully modifying the data.
Diffstat (limited to 'include')
-rw-r--r--include/nl-aux-route/nl-route.h29
1 files changed, 26 insertions, 3 deletions
diff --git a/include/nl-aux-route/nl-route.h b/include/nl-aux-route/nl-route.h
index a0193d2..9c85337 100644
--- a/include/nl-aux-route/nl-route.h
+++ b/include/nl-aux-route/nl-route.h
@@ -5,6 +5,8 @@
#include "base/nl-base-utils.h"
+#include <netlink/route/action.h>
+
struct rtnl_link;
void rtnl_link_put(struct rtnl_link *);
#define _nl_auto_rtnl_link _nl_auto(_nl_auto_rtnl_link_fcn)
@@ -40,13 +42,10 @@ void rtnl_link_af_ops_put(struct rtnl_link_af_ops *);
_NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_link_af_ops *,
_nl_auto_rtnl_link_af_ops_fcn, rtnl_link_af_ops_put);
-struct rtnl_act;
-void rtnl_act_put(struct rtnl_act *);
#define _nl_auto_rtnl_act _nl_auto(_nl_auto_rtnl_act_fcn)
_NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_act *, _nl_auto_rtnl_act_fcn,
rtnl_act_put);
-void rtnl_act_put_all(struct rtnl_act **head);
#define _nl_auto_rtnl_act_all _nl_auto(_nl_auto_rtnl_act_fcn_all)
_NL_AUTO_DEFINE_FCN_INDIRECT0(struct rtnl_act *, _nl_auto_rtnl_act_fcn_all,
rtnl_act_put_all);
@@ -64,4 +63,28 @@ void rtnl_cls_put(struct rtnl_cls *);
_NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_cls *, _nl_auto_rtnl_cls_fcn,
rtnl_cls_put);
+/*****************************************************************************/
+
+static inline int _rtnl_act_append_get(struct rtnl_act **head,
+ struct rtnl_act *new)
+{
+ int r;
+
+ r = rtnl_act_append(head, new);
+ if (r >= 0)
+ rtnl_act_get(new);
+ return r;
+}
+
+static inline int _rtnl_act_append_take(struct rtnl_act **head,
+ struct rtnl_act *new)
+{
+ int r;
+
+ r = rtnl_act_append(head, new);
+ if (r < 0)
+ rtnl_act_put(new);
+ return r;
+}
+
#endif /* __NETLINK_NL_AUX_ROUTE_NL_ROUTE_H__ */