From 00429def23a684f19eb1e95083f4579b3ac73810 Mon Sep 17 00:00:00 2001 From: Eva Kurchatova Date: Sun, 24 May 2026 19:35:49 +0300 Subject: [PATCH 1/2] selftests/clone3: fix libcap interface usage The test's set_capability() function needs to set CAP_CHECKPOINT_RESTORE (bit 40). But libcap's API (cap_set_flag) didn't support cap 40 when the test was written - it was too new. So the author worked around it by casting cap_t to an assumed internal layout. This worked with older libcap versions where cap_t pointed directly to that layout. Newer libcap internally restructured its cap_t opaque type. Since 2.43, libcap natively supports CAP_CHECKPOINT_RESTORE, workaround is no longer needed. The fix directly uses the library interface. Signed-off-by: Eva Kurchatova Link: https://patch.msgid.link/20260524163840.34247-2-eva.kurchatova@virtuozzo.com Signed-off-by: Christian Brauner (Amutable) --- .../clone3/clone3_cap_checkpoint_restore.c | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/tools/testing/selftests/clone3/clone3_cap_checkpoint_restore.c b/tools/testing/selftests/clone3/clone3_cap_checkpoint_restore.c index e82281efa273..49fb2edd5a7d 100644 --- a/tools/testing/selftests/clone3/clone3_cap_checkpoint_restore.c +++ b/tools/testing/selftests/clone3/clone3_cap_checkpoint_restore.c @@ -87,15 +87,11 @@ static int test_clone3_set_tid(struct __test_metadata *_metadata, return ret; } -struct libcap { - struct __user_cap_header_struct hdr; - struct __user_cap_data_struct data[2]; -}; - static int set_capability(void) { - cap_value_t cap_values[] = { CAP_SETUID, CAP_SETGID }; - struct libcap *cap; + cap_value_t cap_values[] = { + CAP_SETUID, CAP_SETGID, CAP_CHECKPOINT_RESTORE + }; int ret = -1; cap_t caps; @@ -111,14 +107,8 @@ static int set_capability(void) goto out; } - cap_set_flag(caps, CAP_EFFECTIVE, 2, cap_values, CAP_SET); - cap_set_flag(caps, CAP_PERMITTED, 2, cap_values, CAP_SET); - - cap = (struct libcap *) caps; - - /* 40 -> CAP_CHECKPOINT_RESTORE */ - cap->data[1].effective |= 1 << (40 - 32); - cap->data[1].permitted |= 1 << (40 - 32); + cap_set_flag(caps, CAP_EFFECTIVE, 3, cap_values, CAP_SET); + cap_set_flag(caps, CAP_PERMITTED, 3, cap_values, CAP_SET); if (cap_set_proc(caps)) { perror("cap_set_proc"); From f192084a9c6ff249fe6f288b7123dab2fdf6c8c6 Mon Sep 17 00:00:00 2001 From: Konstantin Khorenko Date: Sun, 24 May 2026 19:35:50 +0300 Subject: [PATCH 2/2] selftests/clone3: remove unused variables clone3_cap_checkpoint_restore.c: In function 'call_clone3_set_tid': clone3_cap_checkpoint_restore.c:57:22: warning: unused variable 'tmp' [-Wunused-variable] 57 | char tmp = 0; | ^~~ clone3_cap_checkpoint_restore.c:56:21: warning: unused variable 'ret' [-Wunused-variable] 56 | int ret; | ^~~ clone3_cap_checkpoint_restore.c: In function 'clone3_cap_checkpoint_restore': clone3_cap_checkpoint_restore.c:138:13: warning: unused variable 'ret' [-Wunused-variable] 138 | int ret = 0; | ^~~ Remove unused variables 'ret' and 'tmp' to fix -Wunused-variable warnings. Signed-off-by: Konstantin Khorenko Link: https://patch.msgid.link/20260524163840.34247-3-eva.kurchatova@virtuozzo.com Signed-off-by: Christian Brauner (Amutable) --- .../testing/selftests/clone3/clone3_cap_checkpoint_restore.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tools/testing/selftests/clone3/clone3_cap_checkpoint_restore.c b/tools/testing/selftests/clone3/clone3_cap_checkpoint_restore.c index 49fb2edd5a7d..ab62bcf4107d 100644 --- a/tools/testing/selftests/clone3/clone3_cap_checkpoint_restore.c +++ b/tools/testing/selftests/clone3/clone3_cap_checkpoint_restore.c @@ -53,9 +53,6 @@ static int call_clone3_set_tid(struct __test_metadata *_metadata, } if (pid == 0) { - int ret; - char tmp = 0; - TH_LOG("I am the child, my PID is %d (expected %d)", getpid(), set_tid[0]); if (set_tid[0] != getpid()) @@ -125,7 +122,6 @@ TEST(clone3_cap_checkpoint_restore) { pid_t pid; int status; - int ret = 0; pid_t set_tid[1]; test_clone3_supported();