summaryrefslogtreecommitdiffstats
path: root/src/obj/tunnel.c
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2018-10-17 12:32:54 -0700
committerPablo Neira Ayuso <pablo@netfilter.org>2018-10-19 14:56:08 +0200
commitdc240913458d591f59b52b3899d3fc3c5d6ec6ce (patch)
treeb43acfe0306f2ab42a5f5abccc42420fe6a5508c /src/obj/tunnel.c
parentaecc936180d302947ecfab5dacf267a701a5d84c (diff)
src: Use memcpy() to handle potentially unaligned data
Rolf Eike Beer <eike@sf-mail.de> reported that nft-expr_quota-test fails with a SIGBUS on SPARC due to unaligned accesses. This patch resolves that and fixes additional sources of unaligned accesses matching the same pattern. Both nft-expr_quota-test and nft-expr_objref-test generated unaligned accesses on DEC Alpha. Bug: https://bugs.gentoo.org/666448 Signed-off-by: Matt Turner <mattst88@gmail.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/obj/tunnel.c')
-rw-r--r--src/obj/tunnel.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/src/obj/tunnel.c b/src/obj/tunnel.c
index 5b2d9de..7ffade8 100644
--- a/src/obj/tunnel.c
+++ b/src/obj/tunnel.c
@@ -29,13 +29,13 @@ nftnl_obj_tunnel_set(struct nftnl_obj *e, uint16_t type,
switch (type) {
case NFTNL_OBJ_TUNNEL_ID:
- tun->id = *((uint32_t *)data);
+ memcpy(&tun->id, data, sizeof(tun->id));
break;
case NFTNL_OBJ_TUNNEL_IPV4_SRC:
- tun->src_v4 = *((uint32_t *)data);
+ memcpy(&tun->src_v4, data, sizeof(tun->src_v4));
break;
case NFTNL_OBJ_TUNNEL_IPV4_DST:
- tun->dst_v4 = *((uint32_t *)data);
+ memcpy(&tun->dst_v4, data, sizeof(tun->dst_v4));
break;
case NFTNL_OBJ_TUNNEL_IPV6_SRC:
memcpy(&tun->src_v6, data, sizeof(struct in6_addr));
@@ -44,37 +44,37 @@ nftnl_obj_tunnel_set(struct nftnl_obj *e, uint16_t type,
memcpy(&tun->dst_v6, data, sizeof(struct in6_addr));
break;
case NFTNL_OBJ_TUNNEL_IPV6_FLOWLABEL:
- tun->flowlabel = (*(uint32_t *)data);
+ memcpy(&tun->flowlabel, data, sizeof(tun->flowlabel));
break;
case NFTNL_OBJ_TUNNEL_SPORT:
- tun->sport = (*(uint16_t *)data);
+ memcpy(&tun->sport, data, sizeof(tun->sport));
break;
case NFTNL_OBJ_TUNNEL_DPORT:
- tun->dport = (*(uint16_t *)data);
+ memcpy(&tun->dport, data, sizeof(tun->dport));
break;
case NFTNL_OBJ_TUNNEL_FLAGS:
- tun->tun_flags = (*(uint32_t *)data);
+ memcpy(&tun->tun_flags, data, sizeof(tun->tun_flags));
break;
case NFTNL_OBJ_TUNNEL_TOS:
- tun->tun_tos = (*(uint8_t *)data);
+ memcpy(&tun->tun_tos, data, sizeof(tun->tun_tos));
break;
case NFTNL_OBJ_TUNNEL_TTL:
- tun->tun_ttl = (*(uint8_t *)data);
+ memcpy(&tun->tun_ttl, data, sizeof(tun->tun_ttl));
break;
case NFTNL_OBJ_TUNNEL_VXLAN_GBP:
- tun->u.tun_vxlan.gbp = (*(uint32_t *)data);
+ memcpy(&tun->u.tun_vxlan.gbp, data, sizeof(tun->u.tun_vxlan.gbp));
break;
case NFTNL_OBJ_TUNNEL_ERSPAN_VERSION:
- tun->u.tun_erspan.version = (*(uint32_t *)data);
+ memcpy(&tun->u.tun_erspan.version, data, sizeof(tun->u.tun_erspan.version));
break;
case NFTNL_OBJ_TUNNEL_ERSPAN_V1_INDEX:
- tun->u.tun_erspan.u.v1_index = (*(uint32_t *)data);
+ memcpy(&tun->u.tun_erspan.u.v1_index, data, sizeof(tun->u.tun_erspan.u.v1_index));
break;
case NFTNL_OBJ_TUNNEL_ERSPAN_V2_HWID:
- tun->u.tun_erspan.u.v2.hwid = (*(uint8_t *)data);
+ memcpy(&tun->u.tun_erspan.u.v2.hwid, data, sizeof(tun->u.tun_erspan.u.v2.hwid));
break;
case NFTNL_OBJ_TUNNEL_ERSPAN_V2_DIR:
- tun->u.tun_erspan.u.v2.dir = (*(uint8_t *)data);
+ memcpy(&tun->u.tun_erspan.u.v2.dir, data, sizeof(tun->u.tun_erspan.u.v2.dir));
break;
default:
return -1;