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 <udipp...@fb.com>
---
 .../selftests/bpf/prog_tests/fexit_bpf2bpf.c  | 40 +++++++++++++++++++
 .../bpf/progs/freplace_connect_v4_prog.c      | 19 +++++++++
 2 files changed, 59 insertions(+)
 create mode 100644 tools/testing/selftests/bpf/progs/freplace_connect_v4_prog.c

diff --git a/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c 
b/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
index 7c7168963d52..d295ca9bbf96 100644
--- a/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
+++ b/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
@@ -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
index 000000000000..544e5ac90461
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/freplace_connect_v4_prog.c
@@ -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";
-- 
2.24.1

Reply via email to