Skip to content

Commit 48b70cf

Browse files
ThreeEightskartben
authored andcommitted
net: ipv6: Fix unaligned access to IPv6 address
Add UNALIGNED_GET() to prevent alignment fault when reading parts of the IPv6 address. Signed-off-by: Steve Boylan <[email protected]>
1 parent f80de97 commit 48b70cf

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

subsys/net/ip/ipv6.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -967,8 +967,10 @@ int net_ipv6_addr_generate_iid(struct net_if *iface,
967967
if (prefix == NULL) {
968968
UNALIGNED_PUT(htonl(0xfe800000), &tmp_prefix.s6_addr32[0]);
969969
} else {
970-
UNALIGNED_PUT(prefix->s6_addr32[0], &tmp_prefix.s6_addr32[0]);
971-
UNALIGNED_PUT(prefix->s6_addr32[1], &tmp_prefix.s6_addr32[1]);
970+
UNALIGNED_PUT(UNALIGNED_GET(&prefix->s6_addr32[0]),
971+
&tmp_prefix.s6_addr32[0]);
972+
UNALIGNED_PUT(UNALIGNED_GET(&prefix->s6_addr32[1]),
973+
&tmp_prefix.s6_addr32[1]);
972974
}
973975

974976
ret = gen_stable_iid(if_index, &tmp_prefix, network_id, network_id_len,
@@ -983,8 +985,8 @@ int net_ipv6_addr_generate_iid(struct net_if *iface,
983985
UNALIGNED_PUT(htonl(0xfe800000), &tmp_addr.s6_addr32[0]);
984986
UNALIGNED_PUT(0, &tmp_addr.s6_addr32[1]);
985987
} else {
986-
UNALIGNED_PUT(prefix->s6_addr32[0], &tmp_addr.s6_addr32[0]);
987-
UNALIGNED_PUT(prefix->s6_addr32[1], &tmp_addr.s6_addr32[1]);
988+
UNALIGNED_PUT(UNALIGNED_GET(&prefix->s6_addr32[0]), &tmp_addr.s6_addr32[0]);
989+
UNALIGNED_PUT(UNALIGNED_GET(&prefix->s6_addr32[1]), &tmp_addr.s6_addr32[1]);
988990
}
989991

990992
if (IS_ENABLED(CONFIG_NET_IPV6_IID_EUI_64)) {

0 commit comments

Comments
 (0)