diff options
author | Thomas Haller <thaller@redhat.com> | 2019-09-01 12:38:22 (GMT) |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-09-01 12:38:59 (GMT) |
commit | ff61de28d738df8135e59cc44123fbc71f99707e (patch) | |
tree | 843775300cf3ffa1d06e92a4170b016f2439c747 | |
parent | d147019c4bbb856be13042d89e95b859f01c808d (diff) | |
download | libnl-ff61de28d738df8135e59cc44123fbc71f99707e.zip libnl-ff61de28d738df8135e59cc44123fbc71f99707e.tar.gz libnl-ff61de28d738df8135e59cc44123fbc71f99707e.tar.bz2 |
xfrmi: return error code from getters for XFRM links
Returning the value directly as uint32_t does not leave room for an error
code. E.g. we want to indicate to the caller whether the attribute is present
or not (-NLE_NOATTR). Currenlty, the code is quite unforgiving and will just
crash/assert against invalid arguments. In theory, we could also be more forgiving
and return a error code if the link argument is invalid.
-rw-r--r-- | include/netlink/route/link/xfrmi.h | 4 | ||||
-rw-r--r-- | lib/route/link/xfrmi.c | 33 |
2 files changed, 22 insertions, 15 deletions
diff --git a/include/netlink/route/link/xfrmi.h b/include/netlink/route/link/xfrmi.h index f361229..6e4cda7 100644 --- a/include/netlink/route/link/xfrmi.h +++ b/include/netlink/route/link/xfrmi.h @@ -25,10 +25,10 @@ extern "C" { extern int rtnl_link_is_xfrmi(struct rtnl_link *link); extern int rtnl_link_xfrmi_set_link(struct rtnl_link *link, uint32_t index); - extern uint32_t rtnl_link_xfrmi_get_link(struct rtnl_link *link); + extern int rtnl_link_xfrmi_get_link(struct rtnl_link *link, uint32_t *out_link); extern int rtnl_link_xfrmi_set_if_id(struct rtnl_link *link, uint32_t if_id); - extern uint32_t rtnl_link_xfrmi_get_if_id(struct rtnl_link *link); + extern int rtnl_link_xfrmi_get_if_id(struct rtnl_link *link, uint32_t *out_if_id); #ifdef __cplusplus } diff --git a/lib/route/link/xfrmi.c b/lib/route/link/xfrmi.c index 65533a6..5a4a563 100644 --- a/lib/route/link/xfrmi.c +++ b/lib/route/link/xfrmi.c @@ -67,7 +67,7 @@ static int xfrmi_alloc(struct rtnl_link *link) } static int xfrmi_parse(struct rtnl_link *link, struct nlattr *data, - struct nlattr *xstats) + struct nlattr *xstats) { struct nlattr *tb[IFLA_XFRM_MAX + 1]; struct xfrmi_info *xfrmi; @@ -77,11 +77,11 @@ static int xfrmi_parse(struct rtnl_link *link, struct nlattr *data, err = nla_parse_nested(tb, IFLA_XFRM_MAX, data, xfrmi_policy); if (err < 0) - goto errout; + return err; err = xfrmi_alloc(link); if (err < 0) - goto errout; + return err; xfrmi = link->l_info; @@ -95,10 +95,7 @@ static int xfrmi_parse(struct rtnl_link *link, struct nlattr *data, xfrmi->xfrmi_mask |= XFRMI_ATTR_IF_ID; } - err = 0; - -errout: - return err; + return 0; } static int xfrmi_put_attrs(struct nl_msg *msg, struct rtnl_link *link) @@ -255,16 +252,21 @@ int rtnl_link_xfrmi_set_link(struct rtnl_link *link, uint32_t index) /** * Get XFRMI link interface index * @arg link Link object + * @arg out_link The output value on success * - * @return interface index + * @return 0 on sucess or a negative error code */ -uint32_t rtnl_link_xfrmi_get_link(struct rtnl_link *link) +int rtnl_link_xfrmi_get_link(struct rtnl_link *link, uint32_t *out_link) { struct xfrmi_info *xfrmi = link->l_info; IS_XFRMI_LINK_ASSERT(link); - return xfrmi->link; + if (!(xfrmi->xfrmi_mask & XFRMI_ATTR_LINK)) + return -NLE_NOATTR; + + *out_link = xfrmi->link; + return 0; } /** @@ -289,16 +291,21 @@ int rtnl_link_xfrmi_set_if_id(struct rtnl_link *link, uint32_t if_id) /** * Get XFRMI if_id * @arg link Link object + * @arg out_if_id The output value on success * - * @return if_id + * @return 0 on sucess or a negative error code */ -uint32_t rtnl_link_xfrmi_get_if_id(struct rtnl_link *link) +int rtnl_link_xfrmi_get_if_id(struct rtnl_link *link, uint32_t *out_if_id) { struct xfrmi_info *xfrmi = link->l_info; IS_XFRMI_LINK_ASSERT(link); - return xfrmi->if_id; + if (!(xfrmi->xfrmi_mask & XFRMI_ATTR_IF_ID)) + return -NLE_NOATTR; + + *out_if_id = xfrmi->if_id; + return 0; } static void __init xfrmi_init(void) |