selftests/bpf: Test for checking return code for the extended prog
authorUdip Pant <udippant@fb.com>
Tue, 25 Aug 2020 23:20:02 +0000 (16:20 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 26 Aug 2020 19:47:56 +0000 (12:47 -0700)
This adds test to enforce same check for the return code for the extended prog
as it is enforced for the target program. It asserts failure for a
return code, which is permitted without the patch in this series, while
it is restricted after the application of this patch.

Signed-off-by: Udip Pant <udippant@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200825232003.2877030-4-udippant@fb.com
tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
tools/testing/selftests/bpf/progs/freplace_connect_v4_prog.c [new file with mode: 0644]

index 7c7168963d52f9572681106e3f503037ab24355d..d295ca9bbf96979f6fc41888ba799fe2a947dfc6 100644 (file)
@@ -142,10 +142,50 @@ static void test_func_replace_verify(void)
                                  prog_name, false);
 }
 
+static void test_func_replace_return_code(void)
+{
+       /*
+        * standalone test that asserts failure to load freplace prog
+        * because of invalid return code.
+        */
+       struct bpf_object *obj = NULL, *pkt_obj;
+       int err, pkt_fd;
+       __u32 duration = 0;
+       const char *target_obj_file = "./connect4_prog.o";
+       const char *obj_file = "./freplace_connect_v4_prog.o";
+
+       err = bpf_prog_load(target_obj_file, BPF_PROG_TYPE_UNSPEC,
+                           &pkt_obj, &pkt_fd);
+       /* the target prog should load fine */
+       if (CHECK(err, "tgt_prog_load", "file %s err %d errno %d\n",
+                 target_obj_file, err, errno))
+               return;
+       DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts,
+                           .attach_prog_fd = pkt_fd,
+                          );
+
+       obj = bpf_object__open_file(obj_file, &opts);
+       if (CHECK(IS_ERR_OR_NULL(obj), "obj_open",
+                 "failed to open %s: %ld\n", obj_file,
+                 PTR_ERR(obj)))
+               goto close_prog;
+
+       /* It should fail to load the program */
+       err = bpf_object__load(obj);
+       if (CHECK(!err, "bpf_obj_load should fail", "err %d\n", err))
+               goto close_prog;
+
+close_prog:
+       if (!IS_ERR_OR_NULL(obj))
+               bpf_object__close(obj);
+       bpf_object__close(pkt_obj);
+}
+
 void test_fexit_bpf2bpf(void)
 {
        test_target_no_callees();
        test_target_yes_callees();
        test_func_replace();
        test_func_replace_verify();
+       test_func_replace_return_code();
 }
diff --git a/tools/testing/selftests/bpf/progs/freplace_connect_v4_prog.c b/tools/testing/selftests/bpf/progs/freplace_connect_v4_prog.c
new file mode 100644 (file)
index 0000000..544e5ac
--- /dev/null
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2020 Facebook
+
+#include <linux/stddef.h>
+#include <linux/ipv6.h>
+#include <linux/bpf.h>
+#include <linux/in.h>
+#include <sys/socket.h>
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_endian.h>
+
+SEC("freplace/connect_v4_prog")
+int new_connect_v4_prog(struct bpf_sock_addr *ctx)
+{
+       // return value thats in invalid range
+       return 255;
+}
+
+char _license[] SEC("license") = "GPL";