Commit 8f6f41f3 authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Daniel Borkmann

selftests/bpf: Fix misaligned accesses in xdp and xdp_bpf2bpf tests

Similar to previous patch, just copy over necessary struct into local
stack variable before checking its fields.
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20211124002325.1737739-14-andrii@kernel.org
parent 43080b71
...@@ -11,8 +11,8 @@ void test_xdp(void) ...@@ -11,8 +11,8 @@ void test_xdp(void)
const char *file = "./test_xdp.o"; const char *file = "./test_xdp.o";
struct bpf_object *obj; struct bpf_object *obj;
char buf[128]; char buf[128];
struct ipv6hdr *iph6 = (void *)buf + sizeof(struct ethhdr); struct ipv6hdr iph6;
struct iphdr *iph = (void *)buf + sizeof(struct ethhdr); struct iphdr iph;
__u32 duration, retval, size; __u32 duration, retval, size;
int err, prog_fd, map_fd; int err, prog_fd, map_fd;
...@@ -28,16 +28,17 @@ void test_xdp(void) ...@@ -28,16 +28,17 @@ void test_xdp(void)
err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4),
buf, &size, &retval, &duration); buf, &size, &retval, &duration);
memcpy(&iph, buf + sizeof(struct ethhdr), sizeof(iph));
CHECK(err || retval != XDP_TX || size != 74 || CHECK(err || retval != XDP_TX || size != 74 ||
iph->protocol != IPPROTO_IPIP, "ipv4", iph.protocol != IPPROTO_IPIP, "ipv4",
"err %d errno %d retval %d size %d\n", "err %d errno %d retval %d size %d\n",
err, errno, retval, size); err, errno, retval, size);
err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6), err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6),
buf, &size, &retval, &duration); buf, &size, &retval, &duration);
memcpy(&iph6, buf + sizeof(struct ethhdr), sizeof(iph6));
CHECK(err || retval != XDP_TX || size != 114 || CHECK(err || retval != XDP_TX || size != 114 ||
iph6->nexthdr != IPPROTO_IPV6, "ipv6", iph6.nexthdr != IPPROTO_IPV6, "ipv6",
"err %d errno %d retval %d size %d\n", "err %d errno %d retval %d size %d\n",
err, errno, retval, size); err, errno, retval, size);
out: out:
......
...@@ -42,7 +42,7 @@ void test_xdp_bpf2bpf(void) ...@@ -42,7 +42,7 @@ void test_xdp_bpf2bpf(void)
char buf[128]; char buf[128];
int err, pkt_fd, map_fd; int err, pkt_fd, map_fd;
bool passed = false; bool passed = false;
struct iphdr *iph = (void *)buf + sizeof(struct ethhdr); struct iphdr iph;
struct iptnl_info value4 = {.family = AF_INET}; struct iptnl_info value4 = {.family = AF_INET};
struct test_xdp *pkt_skel = NULL; struct test_xdp *pkt_skel = NULL;
struct test_xdp_bpf2bpf *ftrace_skel = NULL; struct test_xdp_bpf2bpf *ftrace_skel = NULL;
...@@ -93,9 +93,9 @@ void test_xdp_bpf2bpf(void) ...@@ -93,9 +93,9 @@ void test_xdp_bpf2bpf(void)
/* Run test program */ /* Run test program */
err = bpf_prog_test_run(pkt_fd, 1, &pkt_v4, sizeof(pkt_v4), err = bpf_prog_test_run(pkt_fd, 1, &pkt_v4, sizeof(pkt_v4),
buf, &size, &retval, &duration); buf, &size, &retval, &duration);
memcpy(&iph, buf + sizeof(struct ethhdr), sizeof(iph));
if (CHECK(err || retval != XDP_TX || size != 74 || if (CHECK(err || retval != XDP_TX || size != 74 ||
iph->protocol != IPPROTO_IPIP, "ipv4", iph.protocol != IPPROTO_IPIP, "ipv4",
"err %d errno %d retval %d size %d\n", "err %d errno %d retval %d size %d\n",
err, errno, retval, size)) err, errno, retval, size))
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment