diff options
author | Thomas Haller <thaller@redhat.com> | 2023-12-01 16:53:58 (GMT) |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2023-12-01 18:55:56 (GMT) |
commit | a06c8f76c2ea13793150642600ea14841e92e0aa (patch) | |
tree | 96b63f4d4171eb31388693d008b6f0fb521c84d9 /include | |
parent | 7912b4f90668afab9b7cb7054434d341826b8c54 (diff) | |
download | libnl-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.h | 29 |
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__ */ |