Merge branch 'Improve error handling of verifier tests'
authorAndrii Nakryiko <andrii@kernel.org>
Fri, 4 Dec 2020 19:53:17 +0000 (11:53 -0800)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 4 Dec 2020 19:53:17 +0000 (11:53 -0800)
Florian Lehner says:

====================
These patches improve the error handling for verifier tests. With "Test
the 32bit narrow read" Krzesimir Nowak provided these patches first, but
they were never merged.
The improved error handling helps to implement and test BPF program types
that are not supported yet.

v3:
  - Add explicit fallthrough

v2:
  - Add unpriv check in error validation
====================

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
tools/testing/selftests/bpf/test_verifier.c

index 4bfe3aa..777a814 100644 (file)
@@ -875,19 +875,36 @@ static int do_prog_test_run(int fd_prog, bool unpriv, uint32_t expected_val,
        __u8 tmp[TEST_DATA_LEN << 2];
        __u32 size_tmp = sizeof(tmp);
        uint32_t retval;
-       int err;
+       int err, saved_errno;
 
        if (unpriv)
                set_admin(true);
        err = bpf_prog_test_run(fd_prog, 1, data, size_data,
                                tmp, &size_tmp, &retval, NULL);
+       saved_errno = errno;
+
        if (unpriv)
                set_admin(false);
-       if (err && errno != 524/*ENOTSUPP*/ && errno != EPERM) {
-               printf("Unexpected bpf_prog_test_run error ");
-               return err;
+
+       if (err) {
+               switch (saved_errno) {
+               case 524/*ENOTSUPP*/:
+                       printf("Did not run the program (not supported) ");
+                       return 0;
+               case EPERM:
+                       if (unpriv) {
+                               printf("Did not run the program (no permission) ");
+                               return 0;
+                       }
+                       /* fallthrough; */
+               default:
+                       printf("FAIL: Unexpected bpf_prog_test_run error (%s) ",
+                               strerror(saved_errno));
+                       return err;
+               }
        }
-       if (!err && retval != expected_val &&
+
+       if (retval != expected_val &&
            expected_val != POINTER_VALUE) {
                printf("FAIL retval %d != %d ", retval, expected_val);
                return 1;
@@ -936,6 +953,7 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
        int run_errs, run_successes;
        int map_fds[MAX_NR_MAPS];
        const char *expected_err;
+       int saved_errno;
        int fixup_skips;
        __u32 pflags;
        int i, err;
@@ -997,6 +1015,7 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
        }
 
        fd_prog = bpf_load_program_xattr(&attr, bpf_vlog, sizeof(bpf_vlog));
+       saved_errno = errno;
 
        /* BPF_PROG_TYPE_TRACING requires more setup and
         * bpf_probe_prog_type won't give correct answer
@@ -1013,7 +1032,7 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
        if (expected_ret == ACCEPT || expected_ret == VERBOSE_ACCEPT) {
                if (fd_prog < 0) {
                        printf("FAIL\nFailed to load prog '%s'!\n",
-                              strerror(errno));
+                              strerror(saved_errno));
                        goto fail_log;
                }
 #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS