• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1From 75201f160b9aa49af70d8f46fb1f087e63d603dd Mon Sep 17 00:00:00 2001
2From: Mike Frysinger <vapier@gentoo.org>
3Date: Fri, 8 Feb 2013 17:12:41 -0500
4Subject: [PATCH] syscalls/sysctl: check if __NR_sysctl is defined
5
6Recent kernel ports have started omitting this old syscall, so if it
7isn't defined, just display a normal TCONF message.
8
9Signed-off-by: Mike Frysinger <vapier@gentoo.org>
10---
11 testcases/kernel/syscalls/sysctl/sysctl01.c | 15 +++++++++++++++
12 testcases/kernel/syscalls/sysctl/sysctl03.c | 15 +++++++++++++++
13 testcases/kernel/syscalls/sysctl/sysctl04.c | 15 +++++++++++++++
14 testcases/kernel/syscalls/sysctl/sysctl05.c | 15 +++++++++++++++
15 4 files changed, 60 insertions(+)
16
17diff --git a/testcases/kernel/syscalls/sysctl/sysctl01.c b/testcases/kernel/syscalls/sysctl/sysctl01.c
18index ed2d067..cc2817e 100644
19--- a/testcases/kernel/syscalls/sysctl/sysctl01.c
20+++ b/testcases/kernel/syscalls/sysctl/sysctl01.c
21@@ -53,6 +53,10 @@
22 #include <linux/sysctl.h>
23
24 char *TCID = "sysctl01";
25+
26+/* This is an older/deprecated syscall that newer arches are omitting */
27+#ifdef __NR_sysctl
28+
29 int TST_TOTAL = 3;
30
31 static int sysctl(int *name, int nlen, void *oldval, size_t * oldlenp,
32@@ -194,3 +198,14 @@ void cleanup()
33 	TEST_CLEANUP;
34
35 }
36+
37+#else
38+int TST_TOTAL = 0;		/* Total number of test cases. */
39+
40+int main()
41+{
42+
43+	tst_resm(TCONF, "This test needs a kernel that has sysctl syscall.");
44+	tst_exit();
45+}
46+#endif
47diff --git a/testcases/kernel/syscalls/sysctl/sysctl03.c b/testcases/kernel/syscalls/sysctl/sysctl03.c
48index 09713d7..6caaa72 100644
49--- a/testcases/kernel/syscalls/sysctl/sysctl03.c
50+++ b/testcases/kernel/syscalls/sysctl/sysctl03.c
51@@ -73,6 +73,10 @@
52 #include <pwd.h>
53
54 char *TCID = "sysctl03";
55+
56+/* This is an older/deprecated syscall that newer arches are omitting */
57+#ifdef __NR_sysctl
58+
59 int TST_TOTAL = 2;
60
61 int sysctl(int *name, int nlen, void *oldval, size_t * oldlenp,
62@@ -213,3 +217,14 @@ void cleanup(void)
63 {
64 	TEST_CLEANUP;
65 }
66+
67+#else
68+int TST_TOTAL = 0;		/* Total number of test cases. */
69+
70+int main()
71+{
72+
73+	tst_resm(TCONF, "This test needs a kernel that has sysctl syscall.");
74+	tst_exit();
75+}
76+#endif
77diff --git a/testcases/kernel/syscalls/sysctl/sysctl04.c b/testcases/kernel/syscalls/sysctl/sysctl04.c
78index 3e41418..bda1020 100644
79--- a/testcases/kernel/syscalls/sysctl/sysctl04.c
80+++ b/testcases/kernel/syscalls/sysctl/sysctl04.c
81@@ -54,6 +54,10 @@
82 #include <linux/sysctl.h>
83
84 char *TCID = "sysctl04";
85+
86+/* This is an older/deprecated syscall that newer arches are omitting */
87+#ifdef __NR_sysctl
88+
89 int TST_TOTAL = 2;
90
91 int sysctl(int *name, int nlen, void *oldval, size_t * oldlenp,
92@@ -166,3 +170,14 @@ void cleanup()
93 	TEST_CLEANUP;
94
95 }
96+
97+#else
98+int TST_TOTAL = 0;		/* Total number of test cases. */
99+
100+int main()
101+{
102+
103+	tst_resm(TCONF, "This test needs a kernel that has sysctl syscall.");
104+	tst_exit();
105+}
106+#endif
107diff --git a/testcases/kernel/syscalls/sysctl/sysctl05.c b/testcases/kernel/syscalls/sysctl/sysctl05.c
108index 4ec4e20..e06ad6e 100644
109--- a/testcases/kernel/syscalls/sysctl/sysctl05.c
110+++ b/testcases/kernel/syscalls/sysctl/sysctl05.c
111@@ -56,6 +56,10 @@
112 #include <errno.h>
113
114 char *TCID = "sysctl05";
115+
116+/* This is an older/deprecated syscall that newer arches are omitting */
117+#ifdef __NR_sysctl
118+
119 int TST_TOTAL = 2;
120
121 int sysctl(int *name, int nlen, void *oldval, size_t * oldlenp,
122@@ -193,3 +197,14 @@ void cleanup()
123 	TEST_CLEANUP;
124
125 }
126+
127+#else
128+int TST_TOTAL = 0;		/* Total number of test cases. */
129+
130+int main()
131+{
132+
133+	tst_resm(TCONF, "This test needs a kernel that has sysctl syscall.");
134+	tst_exit();
135+}
136+#endif
137--
1381.8.0.2
139
140From a62b53febaa0a236c00a502c79c8e9ac0f3b468e Mon Sep 17 00:00:00 2001
141From: Mike Frysinger <vapier@gentoo.org>
142Date: Fri, 8 Feb 2013 19:33:22 -0500
143Subject: [PATCH] tomoyo: stop using sysctl()
144
145Recent kernel ports have started omitting this old syscall, and glibc
146makes it an error to try to include that header when it's unavailable.
147So convert over to reading/writing the /proc/sys/ paths directly.
148
149Signed-off-by: Mike Frysinger <vapier@gentoo.org>
150---
151 testcases/kernel/security/tomoyo/include.h         | 31 +++++++++++++++++++++-
152 .../kernel/security/tomoyo/tomoyo_file_test.c      | 10 +++----
153 .../kernel/security/tomoyo/tomoyo_new_file_test.c  | 18 ++++++-------
154 3 files changed, 42 insertions(+), 17 deletions(-)
155
156diff --git a/testcases/kernel/security/tomoyo/include.h b/testcases/kernel/security/tomoyo/include.h
157index 44d6f6a..fd1b19b 100644
158--- a/testcases/kernel/security/tomoyo/include.h
159+++ b/testcases/kernel/security/tomoyo/include.h
160@@ -35,7 +35,6 @@
161 #include <sys/socket.h>
162 #include <sys/stat.h>
163 #include <sys/syscall.h>
164-#include <sys/sysctl.h>
165 #include <sys/time.h>
166 #include <sys/timex.h>
167 #include <sys/types.h>
168@@ -84,6 +83,36 @@ static inline int pivot_root(const char *new_root, const char *put_old)
169 }
170 #endif
171
172+/* The sysctl() wrapper is dead and newer arches omit it now. */
173+static inline int write_sysctl(const char *path, const char *value)
174+{
175+	FILE *fp = fopen(path, "w");
176+	if (!fp)
177+		return 1;
178+	fputs(value, fp);
179+	fclose(fp);
180+	return 0;
181+}
182+
183+static inline int read_sysctl(const char *path, char *value, int len)
184+{
185+	char scratch[100];
186+	FILE *fp = fopen(path, "r");
187+	if (!fp)
188+		return 1;
189+	if (!value) {
190+		value = scratch;
191+		len = sizeof(scratch);
192+	}
193+	if (fgets(value, len, fp))
194+		/* ignore */;
195+	fclose(fp);
196+	return 0;
197+}
198+
199+/* Should be a fairly benign path to bang on. */
200+#define TEST_SYSCTL_PATH "/proc/sys/net/ipv4/ip_local_port_range"
201+
202 #define proc_policy_dir              "/sys/kernel/security/tomoyo/"
203 #define proc_policy_domain_policy    "/sys/kernel/security/tomoyo/domain_policy"
204 #define proc_policy_exception_policy "/sys/kernel/security/tomoyo/exception_policy"
205diff --git a/testcases/kernel/security/tomoyo/tomoyo_file_test.c b/testcases/kernel/security/tomoyo/tomoyo_file_test.c
206index fa2dec1..010802e 100644
207--- a/testcases/kernel/security/tomoyo/tomoyo_file_test.c
208+++ b/testcases/kernel/security/tomoyo/tomoyo_file_test.c
209@@ -77,14 +77,11 @@ static void stage_file_test(void)
210 {
211 	int fd;
212 	{
213-		static int name[] = { CTL_NET, NET_IPV4,
214-				      NET_IPV4_LOCAL_PORT_RANGE };
215-		int buffer[2] = { 32768, 61000 };
216-		size_t size = sizeof(buffer);
217+		const char buffer[] = "32768 61000";
218 		show_prompt("sysctl(READ)");
219-		show_result(sysctl(name, 3, buffer, &size, 0, 0));
220+		show_result(read_sysctl(TEST_SYSCTL_PATH, NULL, 0));
221 		show_prompt("sysctl(WRITE)");
222-		show_result(sysctl(name, 3, 0, 0, buffer, size));
223+		show_result(write_sysctl(TEST_SYSCTL_PATH, buffer));
224 	}
225
226 	/* QUESTION: Is there a file which can be passed to uselib()? */
227diff --git a/testcases/kernel/security/tomoyo/tomoyo_new_file_test.c b/testcases/kernel/security/tomoyo/tomoyo_new_file_test.c
228index 2ed021e..16427d2 100644
229--- a/testcases/kernel/security/tomoyo/tomoyo_new_file_test.c
230+++ b/testcases/kernel/security/tomoyo/tomoyo_new_file_test.c
231@@ -90,9 +90,7 @@ static void mkfifo2(const char *pathname)
232
233 static void stage_file_test(void)
234 {
235-	static int name[] = { CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE };
236-	int buffer[2] = { 32768, 61000 };
237-	size_t size = sizeof(buffer);
238+	const char buffer[] = "32768 61000";
239 	int pipe_fd[2] = { EOF, EOF };
240 	int error = 0;
241 	int fd;
242@@ -127,21 +125,23 @@ static void stage_file_test(void)
243
244 	policy = "allow_read /proc/sys/net/ipv4/ip_local_port_range";
245 	write_domain_policy(policy, 0);
246-	show_result(sysctl(name, 3, buffer, &size, 0, 0), 1);
247+	show_result(read_sysctl(TEST_SYSCTL_PATH, NULL, 0), 1);
248 	write_domain_policy(policy, 1);
249-	show_result(sysctl(name, 3, buffer, &size, 0, 0), 0);
250+	show_result(read_sysctl(TEST_SYSCTL_PATH, NULL, 0), 0);
251
252 	policy = "allow_write /proc/sys/net/ipv4/ip_local_port_range";
253 	write_domain_policy(policy, 0);
254-	show_result(sysctl(name, 3, 0, 0, buffer, size), 1);
255+	show_result(write_sysctl(TEST_SYSCTL_PATH, buffer), 1);
256 	write_domain_policy(policy, 1);
257-	show_result(sysctl(name, 3, 0, 0, buffer, size), 0);
258+	show_result(write_sysctl(TEST_SYSCTL_PATH, buffer), 0);
259
260 	policy = "allow_read/write /proc/sys/net/ipv4/ip_local_port_range";
261 	write_domain_policy(policy, 0);
262-	show_result(sysctl(name, 3, buffer, &size, buffer, size), 1);
263+	show_result(read_sysctl(TEST_SYSCTL_PATH, NULL, 0) &&
264+	            write_sysctl(TEST_SYSCTL_PATH, buffer), 1);
265 	write_domain_policy(policy, 1);
266-	show_result(sysctl(name, 3, buffer, &size, buffer, size), 0);
267+	show_result(read_sysctl(TEST_SYSCTL_PATH, NULL, 0) &&
268+	            write_sysctl(TEST_SYSCTL_PATH, buffer), 0);
269
270 	policy = "allow_read /bin/true";
271 	write_domain_policy(policy, 0);
272--
2731.8.0.2
274