From 75201f160b9aa49af70d8f46fb1f087e63d603dd Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Fri, 8 Feb 2013 17:12:41 -0500 Subject: [PATCH] syscalls/sysctl: check if __NR_sysctl is defined Recent kernel ports have started omitting this old syscall, so if it isn't defined, just display a normal TCONF message. Signed-off-by: Mike Frysinger --- testcases/kernel/syscalls/sysctl/sysctl01.c | 15 +++++++++++++++ testcases/kernel/syscalls/sysctl/sysctl03.c | 15 +++++++++++++++ testcases/kernel/syscalls/sysctl/sysctl04.c | 15 +++++++++++++++ testcases/kernel/syscalls/sysctl/sysctl05.c | 15 +++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/testcases/kernel/syscalls/sysctl/sysctl01.c b/testcases/kernel/syscalls/sysctl/sysctl01.c index ed2d067..cc2817e 100644 --- a/testcases/kernel/syscalls/sysctl/sysctl01.c +++ b/testcases/kernel/syscalls/sysctl/sysctl01.c @@ -53,6 +53,10 @@ #include char *TCID = "sysctl01"; + +/* This is an older/deprecated syscall that newer arches are omitting */ +#ifdef __NR_sysctl + int TST_TOTAL = 3; static int sysctl(int *name, int nlen, void *oldval, size_t * oldlenp, @@ -194,3 +198,14 @@ void cleanup() TEST_CLEANUP; } + +#else +int TST_TOTAL = 0; /* Total number of test cases. */ + +int main() +{ + + tst_resm(TCONF, "This test needs a kernel that has sysctl syscall."); + tst_exit(); +} +#endif diff --git a/testcases/kernel/syscalls/sysctl/sysctl03.c b/testcases/kernel/syscalls/sysctl/sysctl03.c index 09713d7..6caaa72 100644 --- a/testcases/kernel/syscalls/sysctl/sysctl03.c +++ b/testcases/kernel/syscalls/sysctl/sysctl03.c @@ -73,6 +73,10 @@ #include char *TCID = "sysctl03"; + +/* This is an older/deprecated syscall that newer arches are omitting */ +#ifdef __NR_sysctl + int TST_TOTAL = 2; int sysctl(int *name, int nlen, void *oldval, size_t * oldlenp, @@ -213,3 +217,14 @@ void cleanup(void) { TEST_CLEANUP; } + +#else +int TST_TOTAL = 0; /* Total number of test cases. */ + +int main() +{ + + tst_resm(TCONF, "This test needs a kernel that has sysctl syscall."); + tst_exit(); +} +#endif diff --git a/testcases/kernel/syscalls/sysctl/sysctl04.c b/testcases/kernel/syscalls/sysctl/sysctl04.c index 3e41418..bda1020 100644 --- a/testcases/kernel/syscalls/sysctl/sysctl04.c +++ b/testcases/kernel/syscalls/sysctl/sysctl04.c @@ -54,6 +54,10 @@ #include char *TCID = "sysctl04"; + +/* This is an older/deprecated syscall that newer arches are omitting */ +#ifdef __NR_sysctl + int TST_TOTAL = 2; int sysctl(int *name, int nlen, void *oldval, size_t * oldlenp, @@ -166,3 +170,14 @@ void cleanup() TEST_CLEANUP; } + +#else +int TST_TOTAL = 0; /* Total number of test cases. */ + +int main() +{ + + tst_resm(TCONF, "This test needs a kernel that has sysctl syscall."); + tst_exit(); +} +#endif diff --git a/testcases/kernel/syscalls/sysctl/sysctl05.c b/testcases/kernel/syscalls/sysctl/sysctl05.c index 4ec4e20..e06ad6e 100644 --- a/testcases/kernel/syscalls/sysctl/sysctl05.c +++ b/testcases/kernel/syscalls/sysctl/sysctl05.c @@ -56,6 +56,10 @@ #include char *TCID = "sysctl05"; + +/* This is an older/deprecated syscall that newer arches are omitting */ +#ifdef __NR_sysctl + int TST_TOTAL = 2; int sysctl(int *name, int nlen, void *oldval, size_t * oldlenp, @@ -193,3 +197,14 @@ void cleanup() TEST_CLEANUP; } + +#else +int TST_TOTAL = 0; /* Total number of test cases. */ + +int main() +{ + + tst_resm(TCONF, "This test needs a kernel that has sysctl syscall."); + tst_exit(); +} +#endif -- 1.8.0.2 From a62b53febaa0a236c00a502c79c8e9ac0f3b468e Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Fri, 8 Feb 2013 19:33:22 -0500 Subject: [PATCH] tomoyo: stop using sysctl() Recent kernel ports have started omitting this old syscall, and glibc makes it an error to try to include that header when it's unavailable. So convert over to reading/writing the /proc/sys/ paths directly. Signed-off-by: Mike Frysinger --- testcases/kernel/security/tomoyo/include.h | 31 +++++++++++++++++++++- .../kernel/security/tomoyo/tomoyo_file_test.c | 10 +++---- .../kernel/security/tomoyo/tomoyo_new_file_test.c | 18 ++++++------- 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/testcases/kernel/security/tomoyo/include.h b/testcases/kernel/security/tomoyo/include.h index 44d6f6a..fd1b19b 100644 --- a/testcases/kernel/security/tomoyo/include.h +++ b/testcases/kernel/security/tomoyo/include.h @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -84,6 +83,36 @@ static inline int pivot_root(const char *new_root, const char *put_old) } #endif +/* The sysctl() wrapper is dead and newer arches omit it now. */ +static inline int write_sysctl(const char *path, const char *value) +{ + FILE *fp = fopen(path, "w"); + if (!fp) + return 1; + fputs(value, fp); + fclose(fp); + return 0; +} + +static inline int read_sysctl(const char *path, char *value, int len) +{ + char scratch[100]; + FILE *fp = fopen(path, "r"); + if (!fp) + return 1; + if (!value) { + value = scratch; + len = sizeof(scratch); + } + if (fgets(value, len, fp)) + /* ignore */; + fclose(fp); + return 0; +} + +/* Should be a fairly benign path to bang on. */ +#define TEST_SYSCTL_PATH "/proc/sys/net/ipv4/ip_local_port_range" + #define proc_policy_dir "/sys/kernel/security/tomoyo/" #define proc_policy_domain_policy "/sys/kernel/security/tomoyo/domain_policy" #define proc_policy_exception_policy "/sys/kernel/security/tomoyo/exception_policy" diff --git a/testcases/kernel/security/tomoyo/tomoyo_file_test.c b/testcases/kernel/security/tomoyo/tomoyo_file_test.c index fa2dec1..010802e 100644 --- a/testcases/kernel/security/tomoyo/tomoyo_file_test.c +++ b/testcases/kernel/security/tomoyo/tomoyo_file_test.c @@ -77,14 +77,11 @@ static void stage_file_test(void) { int fd; { - static int name[] = { CTL_NET, NET_IPV4, - NET_IPV4_LOCAL_PORT_RANGE }; - int buffer[2] = { 32768, 61000 }; - size_t size = sizeof(buffer); + const char buffer[] = "32768 61000"; show_prompt("sysctl(READ)"); - show_result(sysctl(name, 3, buffer, &size, 0, 0)); + show_result(read_sysctl(TEST_SYSCTL_PATH, NULL, 0)); show_prompt("sysctl(WRITE)"); - show_result(sysctl(name, 3, 0, 0, buffer, size)); + show_result(write_sysctl(TEST_SYSCTL_PATH, buffer)); } /* QUESTION: Is there a file which can be passed to uselib()? */ diff --git a/testcases/kernel/security/tomoyo/tomoyo_new_file_test.c b/testcases/kernel/security/tomoyo/tomoyo_new_file_test.c index 2ed021e..16427d2 100644 --- a/testcases/kernel/security/tomoyo/tomoyo_new_file_test.c +++ b/testcases/kernel/security/tomoyo/tomoyo_new_file_test.c @@ -90,9 +90,7 @@ static void mkfifo2(const char *pathname) static void stage_file_test(void) { - static int name[] = { CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE }; - int buffer[2] = { 32768, 61000 }; - size_t size = sizeof(buffer); + const char buffer[] = "32768 61000"; int pipe_fd[2] = { EOF, EOF }; int error = 0; int fd; @@ -127,21 +125,23 @@ static void stage_file_test(void) policy = "allow_read /proc/sys/net/ipv4/ip_local_port_range"; write_domain_policy(policy, 0); - show_result(sysctl(name, 3, buffer, &size, 0, 0), 1); + show_result(read_sysctl(TEST_SYSCTL_PATH, NULL, 0), 1); write_domain_policy(policy, 1); - show_result(sysctl(name, 3, buffer, &size, 0, 0), 0); + show_result(read_sysctl(TEST_SYSCTL_PATH, NULL, 0), 0); policy = "allow_write /proc/sys/net/ipv4/ip_local_port_range"; write_domain_policy(policy, 0); - show_result(sysctl(name, 3, 0, 0, buffer, size), 1); + show_result(write_sysctl(TEST_SYSCTL_PATH, buffer), 1); write_domain_policy(policy, 1); - show_result(sysctl(name, 3, 0, 0, buffer, size), 0); + show_result(write_sysctl(TEST_SYSCTL_PATH, buffer), 0); policy = "allow_read/write /proc/sys/net/ipv4/ip_local_port_range"; write_domain_policy(policy, 0); - show_result(sysctl(name, 3, buffer, &size, buffer, size), 1); + show_result(read_sysctl(TEST_SYSCTL_PATH, NULL, 0) && + write_sysctl(TEST_SYSCTL_PATH, buffer), 1); write_domain_policy(policy, 1); - show_result(sysctl(name, 3, buffer, &size, buffer, size), 0); + show_result(read_sysctl(TEST_SYSCTL_PATH, NULL, 0) && + write_sysctl(TEST_SYSCTL_PATH, buffer), 0); policy = "allow_read /bin/true"; write_domain_policy(policy, 0); -- 1.8.0.2