selftests/bpf: Fix misaligned memory access in queue_stack_map test
authorAndrii Nakryiko <andrii@kernel.org>
Wed, 24 Nov 2021 00:23:22 +0000 (16:23 -0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 25 Nov 2021 23:15:03 +0000 (00:15 +0100)
Copy over iphdr into a local variable before accessing 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-11-andrii@kernel.org
tools/testing/selftests/bpf/prog_tests/queue_stack_map.c

index 8ccba3ab70eeac3c7f29631f8629f4b8aec2a0ff..b9822f914eeb4a140567869b42e15d8329a6eeac 100644 (file)
@@ -14,7 +14,7 @@ static void test_queue_stack_map_by_type(int type)
        int i, err, prog_fd, map_in_fd, map_out_fd;
        char file[32], buf[128];
        struct bpf_object *obj;
-       struct iphdr *iph = (void *)buf + sizeof(struct ethhdr);
+       struct iphdr iph;
 
        /* Fill test values to be used */
        for (i = 0; i < MAP_SIZE; i++)
@@ -60,15 +60,17 @@ static void test_queue_stack_map_by_type(int type)
 
                err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4),
                                        buf, &size, &retval, &duration);
-               if (err || retval || size != sizeof(pkt_v4) ||
-                   iph->daddr != val)
+               if (err || retval || size != sizeof(pkt_v4))
+                       break;
+               memcpy(&iph, buf + sizeof(struct ethhdr), sizeof(iph));
+               if (iph.daddr != val)
                        break;
        }
 
-       CHECK(err || retval || size != sizeof(pkt_v4) || iph->daddr != val,
+       CHECK(err || retval || size != sizeof(pkt_v4) || iph.daddr != val,
              "bpf_map_pop_elem",
              "err %d errno %d retval %d size %d iph->daddr %u\n",
-             err, errno, retval, size, iph->daddr);
+             err, errno, retval, size, iph.daddr);
 
        /* Queue is empty, program should return TC_ACT_SHOT */
        err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4),