diff options
author | Thomas Haller <thaller@redhat.com> | 2014-03-20 18:18:43 (GMT) |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2014-03-21 11:27:23 (GMT) |
commit | 3584a7ab55cb93225a0216385b62fbe5331388cd (patch) | |
tree | 9cb1219be8461a1395823a53099d9f0155f15a9a /lib/route | |
parent | dfd0a80ec845a800504fecb936c2b33d6918fc9c (diff) | |
download | libnl-3584a7ab55cb93225a0216385b62fbe5331388cd.zip libnl-3584a7ab55cb93225a0216385b62fbe5331388cd.tar.gz libnl-3584a7ab55cb93225a0216385b62fbe5331388cd.tar.bz2 |
route: detect missing cfgid in rtnl_link_inet_get_conf()
If the netlink message for IFLA_INET_CONF contains less then
IPV4_DEVCONF_MAX entires, the last entries in i_conf are unset.
Modify rtnl_link_inet_get_conf() to return -EINVAL when accessing
an unset cfgid.
Acked-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: Thomas Haller <thaller@redhat.com>
Diffstat (limited to 'lib/route')
-rw-r--r-- | lib/route/link/inet.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/route/link/inet.c b/lib/route/link/inet.c index eb2e8ae..2e61323 100644 --- a/lib/route/link/inet.c +++ b/lib/route/link/inet.c @@ -107,8 +107,14 @@ static int inet_parse_af(struct rtnl_link *link, struct nlattr *attr, void *data if (tb[IFLA_INET_CONF] && nla_len(tb[IFLA_INET_CONF]) % 4) return -EINVAL; - if (tb[IFLA_INET_CONF]) + if (tb[IFLA_INET_CONF]) { + int i; + int len = min_t(int, IPV4_DEVCONF_MAX, nla_len(tb[IFLA_INET_CONF]) / 4); + + for (i = 0; i < len; i++) + id->i_confset[i] = 1; nla_memcpy(&id->i_conf, tb[IFLA_INET_CONF], sizeof(id->i_conf)); + } return 0; } @@ -186,7 +192,7 @@ static void inet_dump_details(struct rtnl_link *link, for (i = 0; i < IPV4_DEVCONF_MAX; i++) { nl_dump_line(p, "%-19s %3u", rtnl_link_inet_devconf2str(i+1, buf, sizeof(buf)), - id->i_conf[i]); + id->i_confset[i] ? id->i_conf[i] : 0); if (++n == 3) { nl_dump(p, "\n"); @@ -222,6 +228,8 @@ static struct rtnl_link_af_ops inet_ops = { * @return 0 on success or a negative error code. * @return -NLE_RANGE cfgid is out of range, 1..IPV4_DEVCONF_MAX * @return -NLE_NOATTR configuration setting not available + * @return -NLE_INVAL cfgid not set. If the link was received via netlink, + * it means that the cfgid is not supported. */ int rtnl_link_inet_get_conf(struct rtnl_link *link, const unsigned int cfgid, uint32_t *res) @@ -234,6 +242,8 @@ int rtnl_link_inet_get_conf(struct rtnl_link *link, const unsigned int cfgid, if (!(id = rtnl_link_af_alloc(link, &inet_ops))) return -NLE_NOATTR; + if (!id->i_confset[cfgid - 1]) + return -NLE_INVAL; *res = id->i_conf[cfgid - 1]; return 0; |