This follow-up patch completes centralization of kselftest.h and ksefltest_harness.h includes in remaining seltests files, replacing all relative paths with a non-relative paths using shared -I include path in lib.mk Tested with gcc-13.3 and clang-18.1, and cross-compiled successfully on riscv, arm64, x86_64 and powerpc arch. [reddybalavignesh9979@gmail.com: add selftests include path for kselftest.h] Link: https://lkml.kernel.org/r/20251017090201.317521-1-reddybalavignesh9979@gmail.com Link: https://lkml.kernel.org/r/20251016104409.68985-1-reddybalavignesh9979@gmail.com Signed-off-by: Bala-Vignesh-Reddy <reddybalavignesh9979@gmail.com> Suggested-by: Andrew Morton <akpm@linux-foundation.org> Link: https://lore.kernel.org/lkml/20250820143954.33d95635e504e94df01930d0@linux-foundation.org/ Reviewed-by: Wei Yang <richard.weiyang@gmail.com> Cc: David Hildenbrand <david@redhat.com> Cc: David S. Miller <davem@davemloft.net> Cc: Eric Dumazet <edumazet@google.com> Cc: Günther Noack <gnoack@google.com> Cc: Jakub Kacinski <kuba@kernel.org> Cc: Liam Howlett <liam.howlett@oracle.com> Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Cc: Michal Hocko <mhocko@suse.com> Cc: Mickael Salaun <mic@digikod.net> Cc: Ming Lei <ming.lei@redhat.com> Cc: Paolo Abeni <pabeni@redhat.com> Cc: Shuah Khan <shuah@kernel.org> Cc: Simon Horman <horms@kernel.org> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
78 lines
1.7 KiB
C
78 lines
1.7 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <cap-ng.h>
|
|
#include <linux/capability.h>
|
|
#include <stdbool.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <sys/prctl.h>
|
|
#include <sys/auxv.h>
|
|
|
|
#include "kselftest.h"
|
|
|
|
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19)
|
|
# define HAVE_GETAUXVAL
|
|
#endif
|
|
|
|
static bool bool_arg(char **argv, int i)
|
|
{
|
|
if (!strcmp(argv[i], "0"))
|
|
return false;
|
|
else if (!strcmp(argv[i], "1"))
|
|
return true;
|
|
else {
|
|
ksft_exit_fail_msg("wrong argv[%d]\n", i);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
const char *atsec = "";
|
|
int ret;
|
|
|
|
/*
|
|
* Be careful just in case a setgid or setcapped copy of this
|
|
* helper gets out.
|
|
*/
|
|
|
|
if (argc != 5)
|
|
ksft_exit_fail_msg("wrong argc\n");
|
|
|
|
#ifdef HAVE_GETAUXVAL
|
|
if (getauxval(AT_SECURE))
|
|
atsec = " (AT_SECURE is set)";
|
|
else
|
|
atsec = " (AT_SECURE is not set)";
|
|
#endif
|
|
|
|
ret = capng_get_caps_process();
|
|
if (ret == -1) {
|
|
ksft_print_msg("capng_get_caps_process failed\n");
|
|
return 1;
|
|
}
|
|
|
|
if (capng_have_capability(CAPNG_EFFECTIVE, CAP_NET_BIND_SERVICE) != bool_arg(argv, 1)) {
|
|
ksft_print_msg("Wrong effective state%s\n", atsec);
|
|
return 1;
|
|
}
|
|
|
|
if (capng_have_capability(CAPNG_PERMITTED, CAP_NET_BIND_SERVICE) != bool_arg(argv, 2)) {
|
|
ksft_print_msg("Wrong permitted state%s\n", atsec);
|
|
return 1;
|
|
}
|
|
|
|
if (capng_have_capability(CAPNG_INHERITABLE, CAP_NET_BIND_SERVICE) != bool_arg(argv, 3)) {
|
|
ksft_print_msg("Wrong inheritable state%s\n", atsec);
|
|
return 1;
|
|
}
|
|
|
|
if (prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_IS_SET, CAP_NET_BIND_SERVICE, 0, 0, 0) != bool_arg(argv, 4)) {
|
|
ksft_print_msg("Wrong ambient state%s\n", atsec);
|
|
return 1;
|
|
}
|
|
|
|
ksft_print_msg("%s: Capabilities after execve were correct\n",
|
|
"validate_cap:");
|
|
return 0;
|
|
}
|