273 lines
8.4 KiB
Diff
273 lines
8.4 KiB
Diff
From 75201f160b9aa49af70d8f46fb1f087e63d603dd Mon Sep 17 00:00:00 2001
|
|
From: Mike Frysinger <vapier@gentoo.org>
|
|
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 <vapier@gentoo.org>
|
|
---
|
|
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 <linux/sysctl.h>
|
|
|
|
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 <pwd.h>
|
|
|
|
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 <linux/sysctl.h>
|
|
|
|
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 <errno.h>
|
|
|
|
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 <vapier@gentoo.org>
|
|
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 <vapier@gentoo.org>
|
|
---
|
|
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 <sys/socket.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/syscall.h>
|
|
-#include <sys/sysctl.h>
|
|
#include <sys/time.h>
|
|
#include <sys/timex.h>
|
|
#include <sys/types.h>
|
|
@@ -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
|