64bit unaligned access
This patch fixes an unaligned access for IPv6. On systems with strict alignment requirements, the unaligned access will either result in garbage data or a crash.
This commit is contained in:
parent
7adaad784f
commit
f1d9e9d52d
1 changed files with 17 additions and 7 deletions
|
@ -71,23 +71,33 @@ static int inet6_parse_protinfo(struct rtnl_link *link, struct nlattr *attr,
|
|||
if (tb[IFLA_INET6_CONF])
|
||||
nla_memcpy(&i6->i6_conf, tb[IFLA_INET6_CONF],
|
||||
sizeof(i6->i6_conf));
|
||||
|
||||
|
||||
/*
|
||||
* Due to 32bit data alignment, these addresses must be copied to an
|
||||
* aligned location prior to access.
|
||||
*/
|
||||
if (tb[IFLA_INET6_STATS]) {
|
||||
uint64_t *cnt = nla_data(tb[IFLA_INET6_STATS]);
|
||||
unsigned char *cnt = nla_data(tb[IFLA_INET6_STATS]);
|
||||
uint64_t stat;
|
||||
int i;
|
||||
|
||||
for (i = 1; i < __IPSTATS_MIB_MAX; i++)
|
||||
for (i = 1; i < __IPSTATS_MIB_MAX; i++) {
|
||||
memcpy(&stat, &cnt[i * sizeof(stat)], sizeof(stat));
|
||||
rtnl_link_set_stat(link, RTNL_LINK_IP6_INPKTS + i - 1,
|
||||
cnt[i]);
|
||||
stat);
|
||||
}
|
||||
}
|
||||
|
||||
if (tb[IFLA_INET6_ICMP6STATS]) {
|
||||
uint64_t *cnt = nla_data(tb[IFLA_INET6_ICMP6STATS]);
|
||||
unsigned char *cnt = nla_data(tb[IFLA_INET6_ICMP6STATS]);
|
||||
uint64_t stat;
|
||||
int i;
|
||||
|
||||
for (i = 1; i < __ICMP6_MIB_MAX; i++)
|
||||
for (i = 1; i < __ICMP6_MIB_MAX; i++) {
|
||||
memcpy(&stat, &cnt[i * sizeof(stat)], sizeof(stat));
|
||||
rtnl_link_set_stat(link, RTNL_LINK_ICMP6_INMSGS + i - 1,
|
||||
cnt[i]);
|
||||
stat);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Add table
Reference in a new issue