selftests/bpf: Add re-attach test to lsm test
authorJiri Olsa <jolsa@kernel.org>
Wed, 14 Apr 2021 19:51:45 +0000 (21:51 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 26 Apr 2021 04:09:02 +0000 (21:09 -0700)
Adding the test to re-attach (detach/attach again) lsm programs,
plus check that already linked program can't be attached again.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20210414195147.1624932-6-jolsa@kernel.org
tools/testing/selftests/bpf/prog_tests/test_lsm.c

index 2755e4f..d492e76 100644 (file)
@@ -18,6 +18,8 @@ char *CMD_ARGS[] = {"true", NULL};
 #define GET_PAGE_ADDR(ADDR, PAGE_SIZE)                                 \
        (char *)(((unsigned long) (ADDR + PAGE_SIZE)) & ~(PAGE_SIZE-1))
 
+static int duration = 0;
+
 int stack_mprotect(void)
 {
        void *buf;
@@ -51,23 +53,25 @@ int exec_cmd(int *monitored_pid)
        return -EINVAL;
 }
 
-void test_test_lsm(void)
+static int test_lsm(struct lsm *skel)
 {
-       struct lsm *skel = NULL;
-       int err, duration = 0;
+       struct bpf_link *link;
        int buf = 1234;
-
-       skel = lsm__open_and_load();
-       if (CHECK(!skel, "skel_load", "lsm skeleton failed\n"))
-               goto close_prog;
+       int err;
 
        err = lsm__attach(skel);
        if (CHECK(err, "attach", "lsm attach failed: %d\n", err))
-               goto close_prog;
+               return err;
+
+       /* Check that already linked program can't be attached again. */
+       link = bpf_program__attach(skel->progs.test_int_hook);
+       if (CHECK(!IS_ERR(link), "attach_link",
+                 "re-attach without detach should not succeed"))
+               return -1;
 
        err = exec_cmd(&skel->bss->monitored_pid);
        if (CHECK(err < 0, "exec_cmd", "err %d errno %d\n", err, errno))
-               goto close_prog;
+               return err;
 
        CHECK(skel->bss->bprm_count != 1, "bprm_count", "bprm_count = %d\n",
              skel->bss->bprm_count);
@@ -77,7 +81,7 @@ void test_test_lsm(void)
        err = stack_mprotect();
        if (CHECK(errno != EPERM, "stack_mprotect", "want err=EPERM, got %d\n",
                  errno))
-               goto close_prog;
+               return err;
 
        CHECK(skel->bss->mprotect_count != 1, "mprotect_count",
              "mprotect_count = %d\n", skel->bss->mprotect_count);
@@ -89,6 +93,30 @@ void test_test_lsm(void)
        CHECK(skel->bss->copy_test != 3, "copy_test",
              "copy_test = %d\n", skel->bss->copy_test);
 
+       lsm__detach(skel);
+
+       skel->bss->copy_test = 0;
+       skel->bss->bprm_count = 0;
+       skel->bss->mprotect_count = 0;
+       return 0;
+}
+
+void test_test_lsm(void)
+{
+       struct lsm *skel = NULL;
+       int err;
+
+       skel = lsm__open_and_load();
+       if (CHECK(!skel, "lsm_skel_load", "lsm skeleton failed\n"))
+               goto close_prog;
+
+       err = test_lsm(skel);
+       if (CHECK(err, "test_lsm", "first attach failed\n"))
+               goto close_prog;
+
+       err = test_lsm(skel);
+       CHECK(err, "test_lsm", "second attach failed\n");
+
 close_prog:
        lsm__destroy(skel);
 }