xref: /aosp_15_r20/external/liburing/test/register-restrictions.c (revision 25da2bea747f3a93b4c30fd9708b0618ef55a0e6)
1*25da2beaSAndroid Build Coastguard Worker /* SPDX-License-Identifier: MIT */
2*25da2beaSAndroid Build Coastguard Worker /*
3*25da2beaSAndroid Build Coastguard Worker  * Description: test restrictions
4*25da2beaSAndroid Build Coastguard Worker  *
5*25da2beaSAndroid Build Coastguard Worker  */
6*25da2beaSAndroid Build Coastguard Worker #include <errno.h>
7*25da2beaSAndroid Build Coastguard Worker #include <stdio.h>
8*25da2beaSAndroid Build Coastguard Worker #include <unistd.h>
9*25da2beaSAndroid Build Coastguard Worker #include <stdlib.h>
10*25da2beaSAndroid Build Coastguard Worker #include <string.h>
11*25da2beaSAndroid Build Coastguard Worker #include <fcntl.h>
12*25da2beaSAndroid Build Coastguard Worker #include <poll.h>
13*25da2beaSAndroid Build Coastguard Worker #include <sys/eventfd.h>
14*25da2beaSAndroid Build Coastguard Worker 
15*25da2beaSAndroid Build Coastguard Worker #include "liburing.h"
16*25da2beaSAndroid Build Coastguard Worker 
17*25da2beaSAndroid Build Coastguard Worker enum {
18*25da2beaSAndroid Build Coastguard Worker 	TEST_OK,
19*25da2beaSAndroid Build Coastguard Worker 	TEST_SKIPPED,
20*25da2beaSAndroid Build Coastguard Worker 	TEST_FAILED
21*25da2beaSAndroid Build Coastguard Worker };
22*25da2beaSAndroid Build Coastguard Worker 
test_restrictions_sqe_op(void)23*25da2beaSAndroid Build Coastguard Worker static int test_restrictions_sqe_op(void)
24*25da2beaSAndroid Build Coastguard Worker {
25*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_restriction res[2];
26*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_sqe *sqe;
27*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_cqe *cqe;
28*25da2beaSAndroid Build Coastguard Worker 	struct io_uring ring;
29*25da2beaSAndroid Build Coastguard Worker 	int ret, pipe1[2];
30*25da2beaSAndroid Build Coastguard Worker 
31*25da2beaSAndroid Build Coastguard Worker 	uint64_t ptr;
32*25da2beaSAndroid Build Coastguard Worker 	struct iovec vec = {
33*25da2beaSAndroid Build Coastguard Worker 		.iov_base = &ptr,
34*25da2beaSAndroid Build Coastguard Worker 		.iov_len = sizeof(ptr)
35*25da2beaSAndroid Build Coastguard Worker 	};
36*25da2beaSAndroid Build Coastguard Worker 
37*25da2beaSAndroid Build Coastguard Worker 	if (pipe(pipe1) != 0) {
38*25da2beaSAndroid Build Coastguard Worker 		perror("pipe");
39*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
40*25da2beaSAndroid Build Coastguard Worker 	}
41*25da2beaSAndroid Build Coastguard Worker 
42*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_queue_init(8, &ring, IORING_SETUP_R_DISABLED);
43*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
44*25da2beaSAndroid Build Coastguard Worker 		if (ret == -EINVAL)
45*25da2beaSAndroid Build Coastguard Worker 			return TEST_SKIPPED;
46*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "ring setup failed: %d\n", ret);
47*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
48*25da2beaSAndroid Build Coastguard Worker 	}
49*25da2beaSAndroid Build Coastguard Worker 
50*25da2beaSAndroid Build Coastguard Worker 	res[0].opcode = IORING_RESTRICTION_SQE_OP;
51*25da2beaSAndroid Build Coastguard Worker 	res[0].sqe_op = IORING_OP_WRITEV;
52*25da2beaSAndroid Build Coastguard Worker 
53*25da2beaSAndroid Build Coastguard Worker 	res[1].opcode = IORING_RESTRICTION_SQE_OP;
54*25da2beaSAndroid Build Coastguard Worker 	res[1].sqe_op = IORING_OP_WRITE;
55*25da2beaSAndroid Build Coastguard Worker 
56*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_restrictions(&ring, res, 2);
57*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
58*25da2beaSAndroid Build Coastguard Worker 		if (ret == -EINVAL)
59*25da2beaSAndroid Build Coastguard Worker 			return TEST_SKIPPED;
60*25da2beaSAndroid Build Coastguard Worker 
61*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "failed to register restrictions: %d\n", ret);
62*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
63*25da2beaSAndroid Build Coastguard Worker 	}
64*25da2beaSAndroid Build Coastguard Worker 
65*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_enable_rings(&ring);
66*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
67*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "ring enabling failed: %d\n", ret);
68*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
69*25da2beaSAndroid Build Coastguard Worker 	}
70*25da2beaSAndroid Build Coastguard Worker 
71*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
72*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_writev(sqe, pipe1[1], &vec, 1, 0);
73*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 1;
74*25da2beaSAndroid Build Coastguard Worker 
75*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
76*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_readv(sqe, pipe1[0], &vec, 1, 0);
77*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 2;
78*25da2beaSAndroid Build Coastguard Worker 
79*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_submit(&ring);
80*25da2beaSAndroid Build Coastguard Worker 	if (ret != 2) {
81*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "submit: %d\n", ret);
82*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
83*25da2beaSAndroid Build Coastguard Worker 	}
84*25da2beaSAndroid Build Coastguard Worker 
85*25da2beaSAndroid Build Coastguard Worker 	for (int i = 0; i < 2; i++) {
86*25da2beaSAndroid Build Coastguard Worker 		ret = io_uring_wait_cqe(&ring, &cqe);
87*25da2beaSAndroid Build Coastguard Worker 		if (ret) {
88*25da2beaSAndroid Build Coastguard Worker 			fprintf(stderr, "wait: %d\n", ret);
89*25da2beaSAndroid Build Coastguard Worker 			return TEST_FAILED;
90*25da2beaSAndroid Build Coastguard Worker 		}
91*25da2beaSAndroid Build Coastguard Worker 
92*25da2beaSAndroid Build Coastguard Worker 		switch (cqe->user_data) {
93*25da2beaSAndroid Build Coastguard Worker 		case 1: /* writev */
94*25da2beaSAndroid Build Coastguard Worker 			if (cqe->res != sizeof(ptr)) {
95*25da2beaSAndroid Build Coastguard Worker 				fprintf(stderr, "write res: %d\n", cqe->res);
96*25da2beaSAndroid Build Coastguard Worker 				return TEST_FAILED;
97*25da2beaSAndroid Build Coastguard Worker 			}
98*25da2beaSAndroid Build Coastguard Worker 
99*25da2beaSAndroid Build Coastguard Worker 			break;
100*25da2beaSAndroid Build Coastguard Worker 		case 2: /* readv should be denied */
101*25da2beaSAndroid Build Coastguard Worker 			if (cqe->res != -EACCES) {
102*25da2beaSAndroid Build Coastguard Worker 				fprintf(stderr, "read res: %d\n", cqe->res);
103*25da2beaSAndroid Build Coastguard Worker 				return TEST_FAILED;
104*25da2beaSAndroid Build Coastguard Worker 			}
105*25da2beaSAndroid Build Coastguard Worker 			break;
106*25da2beaSAndroid Build Coastguard Worker 		}
107*25da2beaSAndroid Build Coastguard Worker 		io_uring_cqe_seen(&ring, cqe);
108*25da2beaSAndroid Build Coastguard Worker 	}
109*25da2beaSAndroid Build Coastguard Worker 
110*25da2beaSAndroid Build Coastguard Worker 	io_uring_queue_exit(&ring);
111*25da2beaSAndroid Build Coastguard Worker 	return TEST_OK;
112*25da2beaSAndroid Build Coastguard Worker }
113*25da2beaSAndroid Build Coastguard Worker 
test_restrictions_register_op(void)114*25da2beaSAndroid Build Coastguard Worker static int test_restrictions_register_op(void)
115*25da2beaSAndroid Build Coastguard Worker {
116*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_restriction res[1];
117*25da2beaSAndroid Build Coastguard Worker 	struct io_uring ring;
118*25da2beaSAndroid Build Coastguard Worker 	int ret, pipe1[2];
119*25da2beaSAndroid Build Coastguard Worker 
120*25da2beaSAndroid Build Coastguard Worker 	uint64_t ptr;
121*25da2beaSAndroid Build Coastguard Worker 	struct iovec vec = {
122*25da2beaSAndroid Build Coastguard Worker 		.iov_base = &ptr,
123*25da2beaSAndroid Build Coastguard Worker 		.iov_len = sizeof(ptr)
124*25da2beaSAndroid Build Coastguard Worker 	};
125*25da2beaSAndroid Build Coastguard Worker 
126*25da2beaSAndroid Build Coastguard Worker 	if (pipe(pipe1) != 0) {
127*25da2beaSAndroid Build Coastguard Worker 		perror("pipe");
128*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
129*25da2beaSAndroid Build Coastguard Worker 	}
130*25da2beaSAndroid Build Coastguard Worker 
131*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_queue_init(8, &ring, IORING_SETUP_R_DISABLED);
132*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
133*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "ring setup failed: %d\n", ret);
134*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
135*25da2beaSAndroid Build Coastguard Worker 	}
136*25da2beaSAndroid Build Coastguard Worker 
137*25da2beaSAndroid Build Coastguard Worker 	res[0].opcode = IORING_RESTRICTION_REGISTER_OP;
138*25da2beaSAndroid Build Coastguard Worker 	res[0].register_op = IORING_REGISTER_BUFFERS;
139*25da2beaSAndroid Build Coastguard Worker 
140*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_restrictions(&ring, res, 1);
141*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
142*25da2beaSAndroid Build Coastguard Worker 		if (ret == -EINVAL)
143*25da2beaSAndroid Build Coastguard Worker 			return TEST_SKIPPED;
144*25da2beaSAndroid Build Coastguard Worker 
145*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "failed to register restrictions: %d\n", ret);
146*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
147*25da2beaSAndroid Build Coastguard Worker 	}
148*25da2beaSAndroid Build Coastguard Worker 
149*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_enable_rings(&ring);
150*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
151*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "ring enabling failed: %d\n", ret);
152*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
153*25da2beaSAndroid Build Coastguard Worker 	}
154*25da2beaSAndroid Build Coastguard Worker 
155*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_buffers(&ring, &vec, 1);
156*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
157*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "io_uring_register_buffers failed: %d\n", ret);
158*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
159*25da2beaSAndroid Build Coastguard Worker 	}
160*25da2beaSAndroid Build Coastguard Worker 
161*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(&ring, pipe1, 2);
162*25da2beaSAndroid Build Coastguard Worker 	if (ret != -EACCES) {
163*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "io_uring_register_files ret: %d\n", ret);
164*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
165*25da2beaSAndroid Build Coastguard Worker 	}
166*25da2beaSAndroid Build Coastguard Worker 
167*25da2beaSAndroid Build Coastguard Worker 	io_uring_queue_exit(&ring);
168*25da2beaSAndroid Build Coastguard Worker 	return TEST_OK;
169*25da2beaSAndroid Build Coastguard Worker }
170*25da2beaSAndroid Build Coastguard Worker 
test_restrictions_fixed_file(void)171*25da2beaSAndroid Build Coastguard Worker static int test_restrictions_fixed_file(void)
172*25da2beaSAndroid Build Coastguard Worker {
173*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_restriction res[4];
174*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_sqe *sqe;
175*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_cqe *cqe;
176*25da2beaSAndroid Build Coastguard Worker 	struct io_uring ring;
177*25da2beaSAndroid Build Coastguard Worker 	int ret, pipe1[2];
178*25da2beaSAndroid Build Coastguard Worker 
179*25da2beaSAndroid Build Coastguard Worker 	uint64_t ptr;
180*25da2beaSAndroid Build Coastguard Worker 	struct iovec vec = {
181*25da2beaSAndroid Build Coastguard Worker 		.iov_base = &ptr,
182*25da2beaSAndroid Build Coastguard Worker 		.iov_len = sizeof(ptr)
183*25da2beaSAndroid Build Coastguard Worker 	};
184*25da2beaSAndroid Build Coastguard Worker 
185*25da2beaSAndroid Build Coastguard Worker 	if (pipe(pipe1) != 0) {
186*25da2beaSAndroid Build Coastguard Worker 		perror("pipe");
187*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
188*25da2beaSAndroid Build Coastguard Worker 	}
189*25da2beaSAndroid Build Coastguard Worker 
190*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_queue_init(8, &ring, IORING_SETUP_R_DISABLED);
191*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
192*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "ring setup failed: %d\n", ret);
193*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
194*25da2beaSAndroid Build Coastguard Worker 	}
195*25da2beaSAndroid Build Coastguard Worker 
196*25da2beaSAndroid Build Coastguard Worker 	res[0].opcode = IORING_RESTRICTION_SQE_OP;
197*25da2beaSAndroid Build Coastguard Worker 	res[0].sqe_op = IORING_OP_WRITEV;
198*25da2beaSAndroid Build Coastguard Worker 
199*25da2beaSAndroid Build Coastguard Worker 	res[1].opcode = IORING_RESTRICTION_SQE_OP;
200*25da2beaSAndroid Build Coastguard Worker 	res[1].sqe_op = IORING_OP_READV;
201*25da2beaSAndroid Build Coastguard Worker 
202*25da2beaSAndroid Build Coastguard Worker 	res[2].opcode = IORING_RESTRICTION_SQE_FLAGS_REQUIRED;
203*25da2beaSAndroid Build Coastguard Worker 	res[2].sqe_flags = IOSQE_FIXED_FILE;
204*25da2beaSAndroid Build Coastguard Worker 
205*25da2beaSAndroid Build Coastguard Worker 	res[3].opcode = IORING_RESTRICTION_REGISTER_OP;
206*25da2beaSAndroid Build Coastguard Worker 	res[3].register_op = IORING_REGISTER_FILES;
207*25da2beaSAndroid Build Coastguard Worker 
208*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_restrictions(&ring, res, 4);
209*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
210*25da2beaSAndroid Build Coastguard Worker 		if (ret == -EINVAL)
211*25da2beaSAndroid Build Coastguard Worker 			return TEST_SKIPPED;
212*25da2beaSAndroid Build Coastguard Worker 
213*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "failed to register restrictions: %d\n", ret);
214*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
215*25da2beaSAndroid Build Coastguard Worker 	}
216*25da2beaSAndroid Build Coastguard Worker 
217*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_enable_rings(&ring);
218*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
219*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "ring enabling failed: %d\n", ret);
220*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
221*25da2beaSAndroid Build Coastguard Worker 	}
222*25da2beaSAndroid Build Coastguard Worker 
223*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(&ring, pipe1, 2);
224*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
225*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "io_uring_register_files ret: %d\n", ret);
226*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
227*25da2beaSAndroid Build Coastguard Worker 	}
228*25da2beaSAndroid Build Coastguard Worker 
229*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
230*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_writev(sqe, 1, &vec, 1, 0);
231*25da2beaSAndroid Build Coastguard Worker 	io_uring_sqe_set_flags(sqe, IOSQE_FIXED_FILE);
232*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 1;
233*25da2beaSAndroid Build Coastguard Worker 
234*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
235*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_readv(sqe, 0, &vec, 1, 0);
236*25da2beaSAndroid Build Coastguard Worker 	io_uring_sqe_set_flags(sqe, IOSQE_FIXED_FILE);
237*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 2;
238*25da2beaSAndroid Build Coastguard Worker 
239*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
240*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_writev(sqe, pipe1[1], &vec, 1, 0);
241*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 3;
242*25da2beaSAndroid Build Coastguard Worker 
243*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_submit(&ring);
244*25da2beaSAndroid Build Coastguard Worker 	if (ret != 3) {
245*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "submit: %d\n", ret);
246*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
247*25da2beaSAndroid Build Coastguard Worker 	}
248*25da2beaSAndroid Build Coastguard Worker 
249*25da2beaSAndroid Build Coastguard Worker 	for (int i = 0; i < 3; i++) {
250*25da2beaSAndroid Build Coastguard Worker 		ret = io_uring_wait_cqe(&ring, &cqe);
251*25da2beaSAndroid Build Coastguard Worker 		if (ret) {
252*25da2beaSAndroid Build Coastguard Worker 			fprintf(stderr, "wait: %d\n", ret);
253*25da2beaSAndroid Build Coastguard Worker 			return TEST_FAILED;
254*25da2beaSAndroid Build Coastguard Worker 		}
255*25da2beaSAndroid Build Coastguard Worker 
256*25da2beaSAndroid Build Coastguard Worker 		switch (cqe->user_data) {
257*25da2beaSAndroid Build Coastguard Worker 		case 1: /* writev */
258*25da2beaSAndroid Build Coastguard Worker 			if (cqe->res != sizeof(ptr)) {
259*25da2beaSAndroid Build Coastguard Worker 				fprintf(stderr, "write res: %d\n", cqe->res);
260*25da2beaSAndroid Build Coastguard Worker 				return TEST_FAILED;
261*25da2beaSAndroid Build Coastguard Worker 			}
262*25da2beaSAndroid Build Coastguard Worker 
263*25da2beaSAndroid Build Coastguard Worker 			break;
264*25da2beaSAndroid Build Coastguard Worker 		case 2: /* readv */
265*25da2beaSAndroid Build Coastguard Worker 			if (cqe->res != sizeof(ptr)) {
266*25da2beaSAndroid Build Coastguard Worker 				fprintf(stderr, "read res: %d\n", cqe->res);
267*25da2beaSAndroid Build Coastguard Worker 				return TEST_FAILED;
268*25da2beaSAndroid Build Coastguard Worker 			}
269*25da2beaSAndroid Build Coastguard Worker 			break;
270*25da2beaSAndroid Build Coastguard Worker 		case 3: /* writev without fixed_file should be denied */
271*25da2beaSAndroid Build Coastguard Worker 			if (cqe->res != -EACCES) {
272*25da2beaSAndroid Build Coastguard Worker 				fprintf(stderr, "write res: %d\n", cqe->res);
273*25da2beaSAndroid Build Coastguard Worker 				return TEST_FAILED;
274*25da2beaSAndroid Build Coastguard Worker 			}
275*25da2beaSAndroid Build Coastguard Worker 			break;
276*25da2beaSAndroid Build Coastguard Worker 		}
277*25da2beaSAndroid Build Coastguard Worker 		io_uring_cqe_seen(&ring, cqe);
278*25da2beaSAndroid Build Coastguard Worker 	}
279*25da2beaSAndroid Build Coastguard Worker 
280*25da2beaSAndroid Build Coastguard Worker 	io_uring_queue_exit(&ring);
281*25da2beaSAndroid Build Coastguard Worker 	return TEST_OK;
282*25da2beaSAndroid Build Coastguard Worker }
283*25da2beaSAndroid Build Coastguard Worker 
test_restrictions_flags(void)284*25da2beaSAndroid Build Coastguard Worker static int test_restrictions_flags(void)
285*25da2beaSAndroid Build Coastguard Worker {
286*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_restriction res[3];
287*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_sqe *sqe;
288*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_cqe *cqe;
289*25da2beaSAndroid Build Coastguard Worker 	struct io_uring ring;
290*25da2beaSAndroid Build Coastguard Worker 	int ret, pipe1[2];
291*25da2beaSAndroid Build Coastguard Worker 
292*25da2beaSAndroid Build Coastguard Worker 	uint64_t ptr;
293*25da2beaSAndroid Build Coastguard Worker 	struct iovec vec = {
294*25da2beaSAndroid Build Coastguard Worker 		.iov_base = &ptr,
295*25da2beaSAndroid Build Coastguard Worker 		.iov_len = sizeof(ptr)
296*25da2beaSAndroid Build Coastguard Worker 	};
297*25da2beaSAndroid Build Coastguard Worker 
298*25da2beaSAndroid Build Coastguard Worker 	if (pipe(pipe1) != 0) {
299*25da2beaSAndroid Build Coastguard Worker 		perror("pipe");
300*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
301*25da2beaSAndroid Build Coastguard Worker 	}
302*25da2beaSAndroid Build Coastguard Worker 
303*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_queue_init(8, &ring, IORING_SETUP_R_DISABLED);
304*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
305*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "ring setup failed: %d\n", ret);
306*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
307*25da2beaSAndroid Build Coastguard Worker 	}
308*25da2beaSAndroid Build Coastguard Worker 
309*25da2beaSAndroid Build Coastguard Worker 	res[0].opcode = IORING_RESTRICTION_SQE_OP;
310*25da2beaSAndroid Build Coastguard Worker 	res[0].sqe_op = IORING_OP_WRITEV;
311*25da2beaSAndroid Build Coastguard Worker 
312*25da2beaSAndroid Build Coastguard Worker 	res[1].opcode = IORING_RESTRICTION_SQE_FLAGS_ALLOWED;
313*25da2beaSAndroid Build Coastguard Worker 	res[1].sqe_flags = IOSQE_ASYNC | IOSQE_IO_LINK;
314*25da2beaSAndroid Build Coastguard Worker 
315*25da2beaSAndroid Build Coastguard Worker 	res[2].opcode = IORING_RESTRICTION_SQE_FLAGS_REQUIRED;
316*25da2beaSAndroid Build Coastguard Worker 	res[2].sqe_flags = IOSQE_FIXED_FILE;
317*25da2beaSAndroid Build Coastguard Worker 
318*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_restrictions(&ring, res, 3);
319*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
320*25da2beaSAndroid Build Coastguard Worker 		if (ret == -EINVAL)
321*25da2beaSAndroid Build Coastguard Worker 			return TEST_SKIPPED;
322*25da2beaSAndroid Build Coastguard Worker 
323*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "failed to register restrictions: %d\n", ret);
324*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
325*25da2beaSAndroid Build Coastguard Worker 	}
326*25da2beaSAndroid Build Coastguard Worker 
327*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(&ring, pipe1, 2);
328*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
329*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "io_uring_register_files ret: %d\n", ret);
330*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
331*25da2beaSAndroid Build Coastguard Worker 	}
332*25da2beaSAndroid Build Coastguard Worker 
333*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_enable_rings(&ring);
334*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
335*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "ring enabling failed: %d\n", ret);
336*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
337*25da2beaSAndroid Build Coastguard Worker 	}
338*25da2beaSAndroid Build Coastguard Worker 
339*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
340*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_writev(sqe, 1, &vec, 1, 0);
341*25da2beaSAndroid Build Coastguard Worker 	io_uring_sqe_set_flags(sqe, IOSQE_FIXED_FILE);
342*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 1;
343*25da2beaSAndroid Build Coastguard Worker 
344*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
345*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_writev(sqe, 1, &vec, 1, 0);
346*25da2beaSAndroid Build Coastguard Worker 	io_uring_sqe_set_flags(sqe, IOSQE_FIXED_FILE | IOSQE_ASYNC);
347*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 2;
348*25da2beaSAndroid Build Coastguard Worker 
349*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
350*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_writev(sqe, 1, &vec, 1, 0);
351*25da2beaSAndroid Build Coastguard Worker 	io_uring_sqe_set_flags(sqe, IOSQE_FIXED_FILE | IOSQE_IO_LINK);
352*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 3;
353*25da2beaSAndroid Build Coastguard Worker 
354*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_submit(&ring);
355*25da2beaSAndroid Build Coastguard Worker 	if (ret != 3) {
356*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "submit: %d\n", ret);
357*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
358*25da2beaSAndroid Build Coastguard Worker 	}
359*25da2beaSAndroid Build Coastguard Worker 
360*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
361*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_writev(sqe, 1, &vec, 1, 0);
362*25da2beaSAndroid Build Coastguard Worker 	io_uring_sqe_set_flags(sqe, IOSQE_FIXED_FILE | IOSQE_IO_DRAIN);
363*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 4;
364*25da2beaSAndroid Build Coastguard Worker 
365*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_submit(&ring);
366*25da2beaSAndroid Build Coastguard Worker 	if (ret != 1) {
367*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "submit: %d\n", ret);
368*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
369*25da2beaSAndroid Build Coastguard Worker 	}
370*25da2beaSAndroid Build Coastguard Worker 
371*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
372*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_writev(sqe, pipe1[1], &vec, 1, 0);
373*25da2beaSAndroid Build Coastguard Worker 	io_uring_sqe_set_flags(sqe, IOSQE_IO_DRAIN);
374*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 5;
375*25da2beaSAndroid Build Coastguard Worker 
376*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_submit(&ring);
377*25da2beaSAndroid Build Coastguard Worker 	if (ret != 1) {
378*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "submit: %d\n", ret);
379*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
380*25da2beaSAndroid Build Coastguard Worker 	}
381*25da2beaSAndroid Build Coastguard Worker 
382*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
383*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_writev(sqe, pipe1[1], &vec, 1, 0);
384*25da2beaSAndroid Build Coastguard Worker 	io_uring_sqe_set_flags(sqe, IOSQE_ASYNC);
385*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 6;
386*25da2beaSAndroid Build Coastguard Worker 
387*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_submit(&ring);
388*25da2beaSAndroid Build Coastguard Worker 	if (ret != 1) {
389*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "submit: %d\n", ret);
390*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
391*25da2beaSAndroid Build Coastguard Worker 	}
392*25da2beaSAndroid Build Coastguard Worker 
393*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
394*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_writev(sqe, pipe1[1], &vec, 1, 0);
395*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 7;
396*25da2beaSAndroid Build Coastguard Worker 
397*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_submit(&ring);
398*25da2beaSAndroid Build Coastguard Worker 	if (ret != 1) {
399*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "submit: %d\n", ret);
400*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
401*25da2beaSAndroid Build Coastguard Worker 	}
402*25da2beaSAndroid Build Coastguard Worker 
403*25da2beaSAndroid Build Coastguard Worker 	for (int i = 0; i < 7; i++) {
404*25da2beaSAndroid Build Coastguard Worker 		ret = io_uring_wait_cqe(&ring, &cqe);
405*25da2beaSAndroid Build Coastguard Worker 		if (ret) {
406*25da2beaSAndroid Build Coastguard Worker 			fprintf(stderr, "wait: %d\n", ret);
407*25da2beaSAndroid Build Coastguard Worker 			return TEST_FAILED;
408*25da2beaSAndroid Build Coastguard Worker 		}
409*25da2beaSAndroid Build Coastguard Worker 
410*25da2beaSAndroid Build Coastguard Worker 		switch (cqe->user_data) {
411*25da2beaSAndroid Build Coastguard Worker 		case 1: /* writev - flags = IOSQE_FIXED_FILE */
412*25da2beaSAndroid Build Coastguard Worker 		case 2: /* writev - flags = IOSQE_FIXED_FILE | IOSQE_ASYNC */
413*25da2beaSAndroid Build Coastguard Worker 		case 3: /* writev - flags = IOSQE_FIXED_FILE | IOSQE_IO_LINK */
414*25da2beaSAndroid Build Coastguard Worker 			if (cqe->res != sizeof(ptr)) {
415*25da2beaSAndroid Build Coastguard Worker 				fprintf(stderr, "write res: %d user_data %" PRIu64 "\n",
416*25da2beaSAndroid Build Coastguard Worker 					cqe->res, (uint64_t) cqe->user_data);
417*25da2beaSAndroid Build Coastguard Worker 				return TEST_FAILED;
418*25da2beaSAndroid Build Coastguard Worker 			}
419*25da2beaSAndroid Build Coastguard Worker 
420*25da2beaSAndroid Build Coastguard Worker 			break;
421*25da2beaSAndroid Build Coastguard Worker 		case 4: /* writev - flags = IOSQE_FIXED_FILE | IOSQE_IO_DRAIN */
422*25da2beaSAndroid Build Coastguard Worker 		case 5: /* writev - flags = IOSQE_IO_DRAIN */
423*25da2beaSAndroid Build Coastguard Worker 		case 6: /* writev - flags = IOSQE_ASYNC */
424*25da2beaSAndroid Build Coastguard Worker 		case 7: /* writev - flags = 0 */
425*25da2beaSAndroid Build Coastguard Worker 			if (cqe->res != -EACCES) {
426*25da2beaSAndroid Build Coastguard Worker 				fprintf(stderr, "write res: %d user_data %" PRIu64 "\n",
427*25da2beaSAndroid Build Coastguard Worker 					cqe->res, (uint64_t) cqe->user_data);
428*25da2beaSAndroid Build Coastguard Worker 				return TEST_FAILED;
429*25da2beaSAndroid Build Coastguard Worker 			}
430*25da2beaSAndroid Build Coastguard Worker 			break;
431*25da2beaSAndroid Build Coastguard Worker 		}
432*25da2beaSAndroid Build Coastguard Worker 		io_uring_cqe_seen(&ring, cqe);
433*25da2beaSAndroid Build Coastguard Worker 	}
434*25da2beaSAndroid Build Coastguard Worker 
435*25da2beaSAndroid Build Coastguard Worker 	io_uring_queue_exit(&ring);
436*25da2beaSAndroid Build Coastguard Worker 	return TEST_OK;
437*25da2beaSAndroid Build Coastguard Worker }
438*25da2beaSAndroid Build Coastguard Worker 
test_restrictions_empty(void)439*25da2beaSAndroid Build Coastguard Worker static int test_restrictions_empty(void)
440*25da2beaSAndroid Build Coastguard Worker {
441*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_restriction res[0];
442*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_sqe *sqe;
443*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_cqe *cqe;
444*25da2beaSAndroid Build Coastguard Worker 	struct io_uring ring;
445*25da2beaSAndroid Build Coastguard Worker 	int ret, pipe1[2];
446*25da2beaSAndroid Build Coastguard Worker 
447*25da2beaSAndroid Build Coastguard Worker 	uint64_t ptr;
448*25da2beaSAndroid Build Coastguard Worker 	struct iovec vec = {
449*25da2beaSAndroid Build Coastguard Worker 		.iov_base = &ptr,
450*25da2beaSAndroid Build Coastguard Worker 		.iov_len = sizeof(ptr)
451*25da2beaSAndroid Build Coastguard Worker 	};
452*25da2beaSAndroid Build Coastguard Worker 
453*25da2beaSAndroid Build Coastguard Worker 	if (pipe(pipe1) != 0) {
454*25da2beaSAndroid Build Coastguard Worker 		perror("pipe");
455*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
456*25da2beaSAndroid Build Coastguard Worker 	}
457*25da2beaSAndroid Build Coastguard Worker 
458*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_queue_init(8, &ring, IORING_SETUP_R_DISABLED);
459*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
460*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "ring setup failed: %d\n", ret);
461*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
462*25da2beaSAndroid Build Coastguard Worker 	}
463*25da2beaSAndroid Build Coastguard Worker 
464*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_restrictions(&ring, res, 0);
465*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
466*25da2beaSAndroid Build Coastguard Worker 		if (ret == -EINVAL)
467*25da2beaSAndroid Build Coastguard Worker 			return TEST_SKIPPED;
468*25da2beaSAndroid Build Coastguard Worker 
469*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "failed to register restrictions: %d\n", ret);
470*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
471*25da2beaSAndroid Build Coastguard Worker 	}
472*25da2beaSAndroid Build Coastguard Worker 
473*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_enable_rings(&ring);
474*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
475*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "ring enabling failed: %d\n", ret);
476*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
477*25da2beaSAndroid Build Coastguard Worker 	}
478*25da2beaSAndroid Build Coastguard Worker 
479*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_buffers(&ring, &vec, 1);
480*25da2beaSAndroid Build Coastguard Worker 	if (ret != -EACCES) {
481*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "io_uring_register_buffers ret: %d\n", ret);
482*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
483*25da2beaSAndroid Build Coastguard Worker 	}
484*25da2beaSAndroid Build Coastguard Worker 
485*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(&ring, pipe1, 2);
486*25da2beaSAndroid Build Coastguard Worker 	if (ret != -EACCES) {
487*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "io_uring_register_files ret: %d\n", ret);
488*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
489*25da2beaSAndroid Build Coastguard Worker 	}
490*25da2beaSAndroid Build Coastguard Worker 
491*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
492*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_writev(sqe, pipe1[1], &vec, 1, 0);
493*25da2beaSAndroid Build Coastguard Worker 
494*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_submit(&ring);
495*25da2beaSAndroid Build Coastguard Worker 	if (ret != 1) {
496*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "submit: %d\n", ret);
497*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
498*25da2beaSAndroid Build Coastguard Worker 	}
499*25da2beaSAndroid Build Coastguard Worker 
500*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_wait_cqe(&ring, &cqe);
501*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
502*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "wait: %d\n", ret);
503*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
504*25da2beaSAndroid Build Coastguard Worker 	}
505*25da2beaSAndroid Build Coastguard Worker 
506*25da2beaSAndroid Build Coastguard Worker 	if (cqe->res != -EACCES) {
507*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "write res: %d\n", cqe->res);
508*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
509*25da2beaSAndroid Build Coastguard Worker 	}
510*25da2beaSAndroid Build Coastguard Worker 
511*25da2beaSAndroid Build Coastguard Worker 	io_uring_cqe_seen(&ring, cqe);
512*25da2beaSAndroid Build Coastguard Worker 
513*25da2beaSAndroid Build Coastguard Worker 	io_uring_queue_exit(&ring);
514*25da2beaSAndroid Build Coastguard Worker 	return TEST_OK;
515*25da2beaSAndroid Build Coastguard Worker }
516*25da2beaSAndroid Build Coastguard Worker 
test_restrictions_rings_not_disabled(void)517*25da2beaSAndroid Build Coastguard Worker static int test_restrictions_rings_not_disabled(void)
518*25da2beaSAndroid Build Coastguard Worker {
519*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_restriction res[1];
520*25da2beaSAndroid Build Coastguard Worker 	struct io_uring ring;
521*25da2beaSAndroid Build Coastguard Worker 	int ret;
522*25da2beaSAndroid Build Coastguard Worker 
523*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_queue_init(8, &ring, 0);
524*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
525*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "ring setup failed: %d\n", ret);
526*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
527*25da2beaSAndroid Build Coastguard Worker 	}
528*25da2beaSAndroid Build Coastguard Worker 
529*25da2beaSAndroid Build Coastguard Worker 	res[0].opcode = IORING_RESTRICTION_SQE_OP;
530*25da2beaSAndroid Build Coastguard Worker 	res[0].sqe_op = IORING_OP_WRITEV;
531*25da2beaSAndroid Build Coastguard Worker 
532*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_restrictions(&ring, res, 1);
533*25da2beaSAndroid Build Coastguard Worker 	if (ret != -EBADFD) {
534*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "io_uring_register_restrictions ret: %d\n",
535*25da2beaSAndroid Build Coastguard Worker 			ret);
536*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
537*25da2beaSAndroid Build Coastguard Worker 	}
538*25da2beaSAndroid Build Coastguard Worker 
539*25da2beaSAndroid Build Coastguard Worker 	io_uring_queue_exit(&ring);
540*25da2beaSAndroid Build Coastguard Worker 	return TEST_OK;
541*25da2beaSAndroid Build Coastguard Worker }
542*25da2beaSAndroid Build Coastguard Worker 
test_restrictions_rings_disabled(void)543*25da2beaSAndroid Build Coastguard Worker static int test_restrictions_rings_disabled(void)
544*25da2beaSAndroid Build Coastguard Worker {
545*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_sqe *sqe;
546*25da2beaSAndroid Build Coastguard Worker 	struct io_uring ring;
547*25da2beaSAndroid Build Coastguard Worker 	int ret;
548*25da2beaSAndroid Build Coastguard Worker 
549*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_queue_init(8, &ring, IORING_SETUP_R_DISABLED);
550*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
551*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "ring setup failed: %d\n", ret);
552*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
553*25da2beaSAndroid Build Coastguard Worker 	}
554*25da2beaSAndroid Build Coastguard Worker 
555*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
556*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_nop(sqe);
557*25da2beaSAndroid Build Coastguard Worker 
558*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_submit(&ring);
559*25da2beaSAndroid Build Coastguard Worker 	if (ret != -EBADFD) {
560*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "submit: %d\n", ret);
561*25da2beaSAndroid Build Coastguard Worker 		return TEST_FAILED;
562*25da2beaSAndroid Build Coastguard Worker 	}
563*25da2beaSAndroid Build Coastguard Worker 
564*25da2beaSAndroid Build Coastguard Worker 	io_uring_queue_exit(&ring);
565*25da2beaSAndroid Build Coastguard Worker 	return TEST_OK;
566*25da2beaSAndroid Build Coastguard Worker }
567*25da2beaSAndroid Build Coastguard Worker 
main(int argc,char * argv[])568*25da2beaSAndroid Build Coastguard Worker int main(int argc, char *argv[])
569*25da2beaSAndroid Build Coastguard Worker {
570*25da2beaSAndroid Build Coastguard Worker 	int ret;
571*25da2beaSAndroid Build Coastguard Worker 
572*25da2beaSAndroid Build Coastguard Worker 	if (argc > 1)
573*25da2beaSAndroid Build Coastguard Worker 		return 0;
574*25da2beaSAndroid Build Coastguard Worker 
575*25da2beaSAndroid Build Coastguard Worker 	ret = test_restrictions_sqe_op();
576*25da2beaSAndroid Build Coastguard Worker 	if (ret == TEST_SKIPPED) {
577*25da2beaSAndroid Build Coastguard Worker 		printf("test_restrictions_sqe_op: skipped\n");
578*25da2beaSAndroid Build Coastguard Worker 		return 0;
579*25da2beaSAndroid Build Coastguard Worker 	} else if (ret == TEST_FAILED) {
580*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "test_restrictions_sqe_op failed\n");
581*25da2beaSAndroid Build Coastguard Worker 		return ret;
582*25da2beaSAndroid Build Coastguard Worker 	}
583*25da2beaSAndroid Build Coastguard Worker 
584*25da2beaSAndroid Build Coastguard Worker 	ret = test_restrictions_register_op();
585*25da2beaSAndroid Build Coastguard Worker 	if (ret == TEST_SKIPPED) {
586*25da2beaSAndroid Build Coastguard Worker 		printf("test_restrictions_register_op: skipped\n");
587*25da2beaSAndroid Build Coastguard Worker 	} else if (ret == TEST_FAILED) {
588*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "test_restrictions_register_op failed\n");
589*25da2beaSAndroid Build Coastguard Worker 		return ret;
590*25da2beaSAndroid Build Coastguard Worker 	}
591*25da2beaSAndroid Build Coastguard Worker 
592*25da2beaSAndroid Build Coastguard Worker 	ret = test_restrictions_fixed_file();
593*25da2beaSAndroid Build Coastguard Worker 	if (ret == TEST_SKIPPED) {
594*25da2beaSAndroid Build Coastguard Worker 		printf("test_restrictions_fixed_file: skipped\n");
595*25da2beaSAndroid Build Coastguard Worker 	} else if (ret == TEST_FAILED) {
596*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "test_restrictions_fixed_file failed\n");
597*25da2beaSAndroid Build Coastguard Worker 		return ret;
598*25da2beaSAndroid Build Coastguard Worker 	}
599*25da2beaSAndroid Build Coastguard Worker 
600*25da2beaSAndroid Build Coastguard Worker 	ret = test_restrictions_flags();
601*25da2beaSAndroid Build Coastguard Worker 	if (ret == TEST_SKIPPED) {
602*25da2beaSAndroid Build Coastguard Worker 		printf("test_restrictions_flags: skipped\n");
603*25da2beaSAndroid Build Coastguard Worker 	} else if (ret == TEST_FAILED) {
604*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "test_restrictions_flags failed\n");
605*25da2beaSAndroid Build Coastguard Worker 		return ret;
606*25da2beaSAndroid Build Coastguard Worker 	}
607*25da2beaSAndroid Build Coastguard Worker 
608*25da2beaSAndroid Build Coastguard Worker 	ret = test_restrictions_empty();
609*25da2beaSAndroid Build Coastguard Worker 	if (ret == TEST_SKIPPED) {
610*25da2beaSAndroid Build Coastguard Worker 		printf("test_restrictions_empty: skipped\n");
611*25da2beaSAndroid Build Coastguard Worker 	} else if (ret == TEST_FAILED) {
612*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "test_restrictions_empty failed\n");
613*25da2beaSAndroid Build Coastguard Worker 		return ret;
614*25da2beaSAndroid Build Coastguard Worker 	}
615*25da2beaSAndroid Build Coastguard Worker 
616*25da2beaSAndroid Build Coastguard Worker 	ret = test_restrictions_rings_not_disabled();
617*25da2beaSAndroid Build Coastguard Worker 	if (ret == TEST_SKIPPED) {
618*25da2beaSAndroid Build Coastguard Worker 		printf("test_restrictions_rings_not_disabled: skipped\n");
619*25da2beaSAndroid Build Coastguard Worker 	} else if (ret == TEST_FAILED) {
620*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "test_restrictions_rings_not_disabled failed\n");
621*25da2beaSAndroid Build Coastguard Worker 		return ret;
622*25da2beaSAndroid Build Coastguard Worker 	}
623*25da2beaSAndroid Build Coastguard Worker 
624*25da2beaSAndroid Build Coastguard Worker 	ret = test_restrictions_rings_disabled();
625*25da2beaSAndroid Build Coastguard Worker 	if (ret == TEST_SKIPPED) {
626*25da2beaSAndroid Build Coastguard Worker 		printf("test_restrictions_rings_disabled: skipped\n");
627*25da2beaSAndroid Build Coastguard Worker 	} else if (ret == TEST_FAILED) {
628*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "test_restrictions_rings_disabled failed\n");
629*25da2beaSAndroid Build Coastguard Worker 		return ret;
630*25da2beaSAndroid Build Coastguard Worker 	}
631*25da2beaSAndroid Build Coastguard Worker 
632*25da2beaSAndroid Build Coastguard Worker 	return 0;
633*25da2beaSAndroid Build Coastguard Worker }
634