Currently, __xlated_unpriv and __jited_unpriv do not work because the
BPF syscall will overwrite info.jited_prog_len and info.xlated_prog_len
with 0 if the process is not bpf_capable(). This bug was not noticed
before, because there is no test that actually uses
__xlated_unpriv/__jited_unpriv.

To resolve this, simply restore the capabilities earlier (but still
after loading the program). Adding this here unconditionally is fine
because the function first checks that the capabilities were initialized
before attempting to restore them.

This will be important later when we add tests that check whether a
speculation barrier was inserted in the correct location.

Signed-off-by: Luis Gerhorst <luis.gerho...@fau.de>
Fixes: 9c9f73391310 ("selftests/bpf: allow checking xlated programs in 
verifier_* tests")
Fixes: 7d743e4c759c ("selftests/bpf: __jited test tag to check disassembly 
after jit")
---
 tools/testing/selftests/bpf/test_loader.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/tools/testing/selftests/bpf/test_loader.c 
b/tools/testing/selftests/bpf/test_loader.c
index 49f2fc61061f..9551d8d5f8f9 100644
--- a/tools/testing/selftests/bpf/test_loader.c
+++ b/tools/testing/selftests/bpf/test_loader.c
@@ -1042,6 +1042,14 @@ void run_subtest(struct test_loader *tester,
        emit_verifier_log(tester->log_buf, false /*force*/);
        validate_msgs(tester->log_buf, &subspec->expect_msgs, 
emit_verifier_log);
 
+       /* Restore capabilities because the kernel will silently ignore requests
+        * for program info (such as xlated program text) if we are not
+        * bpf-capable. Also, for some reason test_verifier executes programs
+        * with all capabilities restored. Do the same here.
+        */
+       if (restore_capabilities(&caps))
+               goto tobj_cleanup;
+
        if (subspec->expect_xlated.cnt) {
                err = get_xlated_program_text(bpf_program__fd(tprog),
                                              tester->log_buf, 
tester->log_buf_sz);
@@ -1067,12 +1075,6 @@ void run_subtest(struct test_loader *tester,
        }
 
        if (should_do_test_run(spec, subspec)) {
-               /* For some reason test_verifier executes programs
-                * with all capabilities restored. Do the same here.
-                */
-               if (restore_capabilities(&caps))
-                       goto tobj_cleanup;
-
                /* Do bpf_map__attach_struct_ops() for each struct_ops map.
                 * This should trigger bpf_struct_ops->reg callback on kernel 
side.
                 */
-- 
2.49.0


Reply via email to