selftests/bpf: Avoid errno clobbering
authorFlorian Lehner <dev@der-flo.net>
Fri, 4 Dec 2020 18:18:28 +0000 (19:18 +0100)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 4 Dec 2020 19:53:17 +0000 (11:53 -0800)
Print a message when the returned error is about a program type being
not supported or because of permission problems.
These messages are expected if the program to test was actually
executed.

Signed-off-by: Florian Lehner <dev@der-flo.net>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20201204181828.11974-3-dev@der-flo.net
tools/testing/selftests/bpf/test_verifier.c

index ceea940..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;