selftests/bpf: Fix misaligned accesses in xdp and xdp_bpf2bpf tests
authorAndrii Nakryiko <andrii@kernel.org>
Wed, 24 Nov 2021 00:23:25 +0000 (16:23 -0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 25 Nov 2021 23:15:03 +0000 (00:15 +0100)
Similar to previous patch, just copy over necessary struct into local
stack variable before checking its fields.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20211124002325.1737739-14-andrii@kernel.org
tools/testing/selftests/bpf/prog_tests/xdp.c
tools/testing/selftests/bpf/prog_tests/xdp_bpf2bpf.c

index 7a7ef9d..ac65456 100644 (file)
@@ -11,8 +11,8 @@ void test_xdp(void)
        const char *file = "./test_xdp.o";
        struct bpf_object *obj;
        char buf[128];
-       struct ipv6hdr *iph6 = (void *)buf + sizeof(struct ethhdr);
-       struct iphdr *iph = (void *)buf + sizeof(struct ethhdr);
+       struct ipv6hdr iph6;
+       struct iphdr iph;
        __u32 duration, retval, size;
        int err, prog_fd, map_fd;
 
@@ -28,16 +28,17 @@ void test_xdp(void)
 
        err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4),
                                buf, &size, &retval, &duration);
-
+       memcpy(&iph, buf + sizeof(struct ethhdr), sizeof(iph));
        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, errno, retval, size);
 
        err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6),
                                buf, &size, &retval, &duration);
+       memcpy(&iph6, buf + sizeof(struct ethhdr), sizeof(iph6));
        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, errno, retval, size);
 out:
index f99386d..c98a897 100644 (file)
@@ -42,7 +42,7 @@ void test_xdp_bpf2bpf(void)
        char buf[128];
        int err, pkt_fd, map_fd;
        bool passed = false;
-       struct iphdr *iph = (void *)buf + sizeof(struct ethhdr);
+       struct iphdr iph;
        struct iptnl_info value4 = {.family = AF_INET};
        struct test_xdp *pkt_skel = NULL;
        struct test_xdp_bpf2bpf *ftrace_skel = NULL;
@@ -93,9 +93,9 @@ void test_xdp_bpf2bpf(void)
        /* Run test program */
        err = bpf_prog_test_run(pkt_fd, 1, &pkt_v4, sizeof(pkt_v4),
                                buf, &size, &retval, &duration);
-
+       memcpy(&iph, buf + sizeof(struct ethhdr), sizeof(iph));
        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, errno, retval, size))
                goto out;