// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved. * Author: Saji Kumar.V.R * * Description: * This case tests capget() syscall whether works well on three versions. * Also, it checks the results buffer. */ #include #include "tst_test.h" #include "lapi/syscalls.h" #include static pid_t pid; static struct __user_cap_header_struct *hdr; static struct __user_cap_data_struct *data; static struct tcase { int version; char *message; } tcases[] = { {0x19980330, "Test on LINUX_CAPABILITY_VERSION_1"}, {0x20071026, "Test on LINUX_CAPABILITY_VERSION_2"}, {0x20080522, "Test on LINUX_CAPABILITY_VERSION_3"}, }; static void verify_capget(unsigned int n) { struct tcase *tc = &tcases[n]; tst_res(TINFO, "%s", tc->message); hdr->version = tc->version; hdr->pid = pid; TEST(tst_syscall(__NR_capget, hdr, data)); if (TST_RET == 0) tst_res(TPASS, "capget() returned %ld", TST_RET); else tst_res(TFAIL | TTERRNO, "Test Failed, capget() returned %ld", TST_RET); if (data[0].effective & 1 << CAP_NET_RAW) tst_res(TFAIL, "capget() gets CAP_NET_RAW unexpectedly in pE"); else tst_res(TPASS, "capget() doesn't get CAP_NET_RAW as expected in PE"); } static void setup(void) { pid = getpid(); } static struct tst_test test = { .setup = setup, .tcnt = ARRAY_SIZE(tcases), .test = verify_capget, .caps = (struct tst_cap []) { TST_CAP(TST_CAP_DROP, CAP_NET_RAW), {} }, .bufs = (struct tst_buffers []) { {&hdr, .size = sizeof(*hdr)}, {&data, .size = 2 * sizeof(*data)}, {}, } };