From: Feng Yang <yangf...@kylinos.cn>

[ Upstream commit 339c1f8ea11cc042c30c315c1a8f61e4b8a90117 ]

The caller of cap_enable_effective() expects negative error code.
Fix it.

Before:
  failed to restore CAP_SYS_ADMIN: -1, Unknown error -1

After:
  failed to restore CAP_SYS_ADMIN: -3, No such process
  failed to restore CAP_SYS_ADMIN: -22, Invalid argument

Signed-off-by: Feng Yang <yangf...@kylinos.cn>
Acked-by: Eduard Zingerman <eddy...@gmail.com>
Link: https://lore.kernel.org/r/20250305022234.44932-1-yangfeng59...@163.com
Signed-off-by: Alexei Starovoitov <a...@kernel.org>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 tools/testing/selftests/bpf/cap_helpers.c         | 8 ++++----
 tools/testing/selftests/bpf/cap_helpers.h         | 1 +
 tools/testing/selftests/bpf/prog_tests/verifier.c | 4 ++--
 tools/testing/selftests/bpf/test_loader.c         | 6 +++---
 4 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/tools/testing/selftests/bpf/cap_helpers.c 
b/tools/testing/selftests/bpf/cap_helpers.c
index d5ac507401d7c..98f840c3a38f7 100644
--- a/tools/testing/selftests/bpf/cap_helpers.c
+++ b/tools/testing/selftests/bpf/cap_helpers.c
@@ -19,7 +19,7 @@ int cap_enable_effective(__u64 caps, __u64 *old_caps)
 
        err = capget(&hdr, data);
        if (err)
-               return err;
+               return -errno;
 
        if (old_caps)
                *old_caps = (__u64)(data[1].effective) << 32 | 
data[0].effective;
@@ -32,7 +32,7 @@ int cap_enable_effective(__u64 caps, __u64 *old_caps)
        data[1].effective |= cap1;
        err = capset(&hdr, data);
        if (err)
-               return err;
+               return -errno;
 
        return 0;
 }
@@ -49,7 +49,7 @@ int cap_disable_effective(__u64 caps, __u64 *old_caps)
 
        err = capget(&hdr, data);
        if (err)
-               return err;
+               return -errno;
 
        if (old_caps)
                *old_caps = (__u64)(data[1].effective) << 32 | 
data[0].effective;
@@ -61,7 +61,7 @@ int cap_disable_effective(__u64 caps, __u64 *old_caps)
        data[1].effective &= ~cap1;
        err = capset(&hdr, data);
        if (err)
-               return err;
+               return -errno;
 
        return 0;
 }
diff --git a/tools/testing/selftests/bpf/cap_helpers.h 
b/tools/testing/selftests/bpf/cap_helpers.h
index 6d163530cb0fd..8dcb28557f762 100644
--- a/tools/testing/selftests/bpf/cap_helpers.h
+++ b/tools/testing/selftests/bpf/cap_helpers.h
@@ -4,6 +4,7 @@
 
 #include <linux/types.h>
 #include <linux/capability.h>
+#include <errno.h>
 
 #ifndef CAP_PERFMON
 #define CAP_PERFMON            38
diff --git a/tools/testing/selftests/bpf/prog_tests/verifier.c 
b/tools/testing/selftests/bpf/prog_tests/verifier.c
index 8a0e1ff8a2dc6..ecc320e045513 100644
--- a/tools/testing/selftests/bpf/prog_tests/verifier.c
+++ b/tools/testing/selftests/bpf/prog_tests/verifier.c
@@ -121,7 +121,7 @@ static void run_tests_aux(const char *skel_name,
        /* test_verifier tests are executed w/o CAP_SYS_ADMIN, do the same here 
*/
        err = cap_disable_effective(1ULL << CAP_SYS_ADMIN, &old_caps);
        if (err) {
-               PRINT_FAIL("failed to drop CAP_SYS_ADMIN: %i, %s\n", err, 
strerror(err));
+               PRINT_FAIL("failed to drop CAP_SYS_ADMIN: %i, %s\n", err, 
strerror(-err));
                return;
        }
 
@@ -131,7 +131,7 @@ static void run_tests_aux(const char *skel_name,
 
        err = cap_enable_effective(old_caps, NULL);
        if (err)
-               PRINT_FAIL("failed to restore CAP_SYS_ADMIN: %i, %s\n", err, 
strerror(err));
+               PRINT_FAIL("failed to restore CAP_SYS_ADMIN: %i, %s\n", err, 
strerror(-err));
 }
 
 #define RUN(skel) run_tests_aux(#skel, skel##__elf_bytes, NULL)
diff --git a/tools/testing/selftests/bpf/test_loader.c 
b/tools/testing/selftests/bpf/test_loader.c
index 53b06647cf57d..8a403e5aa3145 100644
--- a/tools/testing/selftests/bpf/test_loader.c
+++ b/tools/testing/selftests/bpf/test_loader.c
@@ -773,7 +773,7 @@ static int drop_capabilities(struct cap_state *caps)
 
        err = cap_disable_effective(caps_to_drop, &caps->old_caps);
        if (err) {
-               PRINT_FAIL("failed to drop capabilities: %i, %s\n", err, 
strerror(err));
+               PRINT_FAIL("failed to drop capabilities: %i, %s\n", err, 
strerror(-err));
                return err;
        }
 
@@ -790,7 +790,7 @@ static int restore_capabilities(struct cap_state *caps)
 
        err = cap_enable_effective(caps->old_caps, NULL);
        if (err)
-               PRINT_FAIL("failed to restore capabilities: %i, %s\n", err, 
strerror(err));
+               PRINT_FAIL("failed to restore capabilities: %i, %s\n", err, 
strerror(-err));
        caps->initialized = false;
        return err;
 }
@@ -959,7 +959,7 @@ void run_subtest(struct test_loader *tester,
                if (subspec->caps) {
                        err = cap_enable_effective(subspec->caps, NULL);
                        if (err) {
-                               PRINT_FAIL("failed to set capabilities: %i, 
%s\n", err, strerror(err));
+                               PRINT_FAIL("failed to set capabilities: %i, 
%s\n", err, strerror(-err));
                                goto subtest_cleanup;
                        }
                }
-- 
2.39.5


Reply via email to