summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-02-21 08:37:40 +0100
committerThomas Haller <thaller@redhat.com>2019-02-21 21:02:51 +0100
commit292d037ab2481416c5e1c14af5c1a9e14e9f2951 (patch)
tree8249cd9e035244cf28e74a50814f1d89c68b9cef
parentc31adef67475d24f21ebea838c0e3a07ecbd6e84 (diff)
downloadNetworkManager-292d037ab2481416c5e1c14af5c1a9e14e9f2951.tar.gz
platform: use nla_data_as() at some places
nla_data_as() has a static assertion that casting to the pointer is valid (regarding the alignment of the structure). It also contains an nm_assert() that the data in fact large enough. It's safer, hence prefer it a some places where it makes sense.
-rw-r--r--src/platform/nm-linux-platform.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 920f8a7c52..1fa0c451e5 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -1331,10 +1331,8 @@ _parse_lnk_ip6tnl (const char *kind, struct nlattr *info_data)
{
static const struct nla_policy policy[] = {
[IFLA_IPTUN_LINK] = { .type = NLA_U32 },
- [IFLA_IPTUN_LOCAL] = { .type = NLA_UNSPEC,
- .minlen = sizeof (struct in6_addr)},
- [IFLA_IPTUN_REMOTE] = { .type = NLA_UNSPEC,
- .minlen = sizeof (struct in6_addr)},
+ [IFLA_IPTUN_LOCAL] = { .minlen = sizeof (struct in6_addr)},
+ [IFLA_IPTUN_REMOTE] = { .minlen = sizeof (struct in6_addr)},
[IFLA_IPTUN_TTL] = { .type = NLA_U8 },
[IFLA_IPTUN_ENCAP_LIMIT] = { .type = NLA_U8 },
[IFLA_IPTUN_FLOWINFO] = { .type = NLA_U32 },
@@ -1359,9 +1357,9 @@ _parse_lnk_ip6tnl (const char *kind, struct nlattr *info_data)
if (tb[IFLA_IPTUN_LINK])
props->parent_ifindex = nla_get_u32 (tb[IFLA_IPTUN_LINK]);
if (tb[IFLA_IPTUN_LOCAL])
- memcpy (&props->local, nla_data (tb[IFLA_IPTUN_LOCAL]), sizeof (props->local));
+ props->local = *nla_data_as (struct in6_addr, tb[IFLA_IPTUN_LOCAL]);
if (tb[IFLA_IPTUN_REMOTE])
- memcpy (&props->remote, nla_data (tb[IFLA_IPTUN_REMOTE]), sizeof (props->remote));
+ props->remote = *nla_data_as (struct in6_addr, tb[IFLA_IPTUN_REMOTE]);
if (tb[IFLA_IPTUN_TTL])
props->ttl = nla_get_u8 (tb[IFLA_IPTUN_TTL]);
if (tb[IFLA_IPTUN_ENCAP_LIMIT])
@@ -1432,9 +1430,9 @@ _parse_lnk_ip6gre (const char *kind, struct nlattr *info_data)
if (tb[IFLA_GRE_OKEY])
props->output_key = ntohl (nla_get_u32 (tb[IFLA_GRE_OKEY]));
if (tb[IFLA_GRE_LOCAL])
- memcpy (&props->local, nla_data (tb[IFLA_GRE_LOCAL]), sizeof (props->local));
+ props->local = *nla_data_as (struct in6_addr, tb[IFLA_GRE_LOCAL]);
if (tb[IFLA_GRE_REMOTE])
- memcpy (&props->remote, nla_data (tb[IFLA_GRE_REMOTE]), sizeof (props->remote));
+ props->remote = *nla_data_as (struct in6_addr, tb[IFLA_GRE_REMOTE]);
if (tb[IFLA_GRE_TTL])
props->ttl = nla_get_u8 (tb[IFLA_GRE_TTL]);
if (tb[IFLA_GRE_ENCAP_LIMIT])
@@ -1844,7 +1842,6 @@ _parse_lnk_vxlan (const char *kind, struct nlattr *info_data)
};
NMPlatformLnkVxlan *props;
struct nlattr *tb[G_N_ELEMENTS (policy)];
- struct nm_ifla_vxlan_port_range *range;
NMPObject *obj;
if ( !info_data
@@ -1866,10 +1863,10 @@ _parse_lnk_vxlan (const char *kind, struct nlattr *info_data)
props->group = nla_get_u32 (tb[IFLA_VXLAN_GROUP]);
if (tb[IFLA_VXLAN_LOCAL])
props->local = nla_get_u32 (tb[IFLA_VXLAN_LOCAL]);
- if (tb[IFLA_VXLAN_GROUP6])
- memcpy (&props->group6, nla_data (tb[IFLA_VXLAN_GROUP6]), sizeof (props->group6));
if (tb[IFLA_VXLAN_LOCAL6])
- memcpy (&props->local6, nla_data (tb[IFLA_VXLAN_LOCAL6]), sizeof (props->local6));
+ props->local6 = *nla_data_as (struct in6_addr, tb[IFLA_VXLAN_LOCAL6]);
+ if (tb[IFLA_VXLAN_GROUP6])
+ props->group6 = *nla_data_as (struct in6_addr, tb[IFLA_VXLAN_GROUP6]);
if (tb[IFLA_VXLAN_AGEING])
props->ageing = nla_get_u32 (tb[IFLA_VXLAN_AGEING]);
@@ -1884,7 +1881,9 @@ _parse_lnk_vxlan (const char *kind, struct nlattr *info_data)
props->dst_port = ntohs (nla_get_u16 (tb[IFLA_VXLAN_PORT]));
if (tb[IFLA_VXLAN_PORT_RANGE]) {
- range = nla_data (tb[IFLA_VXLAN_PORT_RANGE]);
+ struct nm_ifla_vxlan_port_range *range;
+
+ range = nla_data_as (struct nm_ifla_vxlan_port_range, tb[IFLA_VXLAN_PORT_RANGE]);
props->src_port_min = ntohs (range->low);
props->src_port_max = ntohs (range->high);
}
@@ -2002,7 +2001,7 @@ _wireguard_update_from_peers_nla (CList *peers,
nm_sock_addr_union_cpy_untrusted (&peer_c->data.endpoint,
tb[WGPEER_A_ENDPOINT] ? nla_data (tb[WGPEER_A_ENDPOINT]) : NULL,
- tb[WGPEER_A_ENDPOINT] ? nla_len (tb[WGPEER_A_ENDPOINT]) : 0);
+ tb[WGPEER_A_ENDPOINT] ? nla_len (tb[WGPEER_A_ENDPOINT]) : 0);
if (tb[WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL])
peer_c->data.persistent_keepalive_interval = nla_get_u16 (tb[WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL]);
@@ -3061,8 +3060,9 @@ _new_from_nl_addr (struct nlmsghdr *nlh, gboolean id_only)
timestamp = 0;
/* IPv6 only */
if (tb[IFA_CACHEINFO]) {
- const struct ifa_cacheinfo *ca = nla_data (tb[IFA_CACHEINFO]);
+ const struct ifa_cacheinfo *ca;
+ ca = nla_data_as (struct ifa_cacheinfo, tb[IFA_CACHEINFO]);
lifetime = ca->ifa_valid;
preferred = ca->ifa_prefered;
timestamp = ca->tstamp;