1 /*-
2 * Copyright (c) 2007 Roman Divacky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27 #include <sys/types.h>
28 #include <sys/syscall.h>
29 #include <sys/stat.h>
30
31 #include <errno.h>
32 #include <fcntl.h>
33 #include <stdbool.h>
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include <unistd.h>
38
39 void cleanup(void);
40 void setup(void);
41 void setup_once(void);
42
43 union param {
44 int i;
45 const char *cp;
46 mode_t m;
47 dev_t d;
48 void *vp;
49 uid_t u;
50 gid_t g;
51 const char **cpp;
52 };
53
54 struct testcase {
55 int result;
56 union param params[5]; /* no *at syscall with more than 5 params */
57 };
58
59 struct test {
60 int syscall;
61 int num_of_cases;
62 const char *name;
63 struct testcase tests[10]; /* no more than 10 tests */
64
65 };
66
67 struct test *tests;
68 #define NUM_OF_TESTS 14 /* we dont want the fexecve test to run */
69
70 char *absolute_path = NULL;
71 const char *relative_path = "tmp/";
72 const char *not_dir_path = "/bin/date";
73
74 const char *file = "foo";
75 char *absolute_file = NULL;
76 char *relative_file = NULL;
77 const char *symlinkf = "link";
78 const char *newlink = "nlink1";
79 const char *newlink2 = "nlink2";
80 const char *newlink3 = "nlink3";
81 const char *newdir = "newdir";
82 const char *fifo = "fifo";
83 const char *nod = "nod";
84 const char *newfile = "newfile";
85 const char *newslink = "nslink1";
86
87 bool dir_exist = false;
88 bool file_exist = false;
89 bool link_exist = false;
90
91 int rel_fd, abs_fd, notd_fd, exec_fd;
92
93 struct timeval times[2];
94 struct stat buf;
95 const char *pargv[2] = { "/bin/date", NULL };
96 #define PATH_MAX 1024
97 char cbuf[PATH_MAX];
98
99 void
setup(void)100 setup(void)
101 {
102 int i, error;
103 struct stat sb;
104 size_t len;
105
106 tests = calloc(NUM_OF_TESTS + 1, sizeof(struct test));
107 if (tests == NULL) {
108 perror("");
109 exit(0);
110 }
111
112 absolute_path = (char *)getcwd(NULL, 0);
113 if (absolute_path == NULL) {
114 perror("getcwd");
115 exit(0);
116 }
117
118 len = strlen(absolute_path);
119 absolute_path = realloc(absolute_path,
120 len + 1 + strlen(relative_path) + 1);
121 if (absolute_path == NULL) {
122 perror("realloc");
123 exit(0);
124 }
125
126 absolute_path[len] = '/';
127 strcpy(absolute_path + len + 1, relative_path);
128
129 absolute_file = malloc(strlen(absolute_path) + 1 + strlen(file));
130 bzero(absolute_file, strlen(absolute_path) + 1 + strlen(file));
131 if (absolute_file == NULL) {
132 perror("malloc");
133 exit(0);
134 }
135 strcpy(absolute_file, absolute_path);
136 absolute_file[strlen(absolute_file)] = '/';
137 strcpy(absolute_file + strlen(absolute_path), file);
138
139 relative_file = malloc(strlen(relative_path) + 1 + strlen(file));
140 bzero(relative_file, strlen(relative_path) + 1 + strlen(file));
141 if (relative_file == NULL) {
142 perror("malloc");
143 exit(0);
144 }
145 strcpy(relative_file, relative_path);
146 relative_file[strlen(relative_file)] = '/';
147 strcpy(relative_file + strlen(relative_path), file);
148
149 error = mkdir(relative_path, 0700);
150 dir_exist = (errno == EEXIST);
151 if (error && errno != EEXIST) {
152 perror("tmp");
153 exit(0);
154 }
155
156 error = stat("tmp/foo", &sb);
157 file_exist = (errno != ENOENT);
158 i = open("tmp/foo", O_RDONLY | O_CREAT, 0666);
159 if (i == -1) {
160 perror("foo");
161 exit(0);
162 }
163
164 rel_fd = open(relative_path, O_RDONLY);
165 if (rel_fd == -1) {
166 perror("relative path");
167 exit(0);
168 }
169
170 abs_fd = open(absolute_path, O_RDONLY);
171 if (abs_fd == -1) {
172 perror("absolute path");
173 exit(0);
174 }
175
176 notd_fd = open(not_dir_path, O_RDONLY);
177 if (notd_fd == -1) {
178 perror("not a directory");
179 exit(0);
180 }
181
182 exec_fd = open(not_dir_path, O_RDONLY);
183 if (exec_fd == -1) {
184 perror("not a directory");
185 exit(0);
186 }
187
188 error = symlink(absolute_file, symlinkf);
189 link_exist = (errno == EEXIST);
190 if (error && errno != EEXIST) {
191 perror("symlink");
192 exit(0);
193 }
194
195 /* faccessat */
196 tests[0].syscall = SYS_faccessat;
197 tests[0].num_of_cases = 6;
198 tests[0].name = "faccessat";
199 tests[0].tests[0].result = EBADF;
200 tests[0].tests[0].params[0].i = 106; /* invalid fd */
201 tests[0].tests[0].params[1].cp = relative_path;
202 tests[0].tests[0].params[2].m = 0;
203 tests[0].tests[0].params[3].i = 0;
204 tests[0].tests[1].result = EBADF;
205 tests[0].tests[1].params[0].i = 106; /* invalid fd */
206 tests[0].tests[1].params[1].cp = relative_path;
207 tests[0].tests[1].params[2].m = 0;
208 tests[0].tests[1].params[3].i = AT_EACCESS;
209 tests[0].tests[2].result = EINVAL;
210 tests[0].tests[2].params[0].i = rel_fd;
211 tests[0].tests[2].params[1].cp = absolute_path;
212 tests[0].tests[2].params[2].m = 0;
213 tests[0].tests[2].params[3].i = 123; /* invalid flag */
214 tests[0].tests[3].result = ENOTDIR;
215 tests[0].tests[3].params[0].i = notd_fd;
216 tests[0].tests[3].params[1].cp = relative_file;
217 tests[0].tests[3].params[2].m = 0;
218 tests[0].tests[3].params[3].i = 0;
219 tests[0].tests[4].result = 0;
220 tests[0].tests[4].params[0].i = rel_fd;
221 tests[0].tests[4].params[1].cp = file;
222 tests[0].tests[4].params[2].m = 0;
223 tests[0].tests[4].params[3].i = 0;
224 tests[0].tests[5].result = 0;
225 tests[0].tests[5].params[0].i = rel_fd;
226 tests[0].tests[5].params[1].cp = file;
227 tests[0].tests[5].params[2].m = 0;
228 tests[0].tests[5].params[3].i = AT_EACCESS;
229 tests[0].tests[6].result = 0;
230 tests[0].tests[6].params[0].i = 106; /* invalid fd */
231 tests[0].tests[6].params[1].cp = absolute_path;
232 tests[0].tests[6].params[2].m = 0;
233 tests[0].tests[6].params[3].i = 0;
234
235 /* fchmodat */
236 tests[1].syscall = SYS_fchmodat;
237 tests[1].num_of_cases = 6;
238 tests[1].name = "fchmodat";
239 tests[1].tests[0].result = EBADF;
240 tests[1].tests[0].params[0].i = 106; /* invalid fd */
241 tests[1].tests[0].params[1].cp = relative_path;
242 tests[1].tests[0].params[2].m = 33190;
243 tests[1].tests[0].params[3].i = 0;
244 tests[1].tests[1].result = EINVAL;
245 tests[1].tests[1].params[0].i = rel_fd;
246 tests[1].tests[1].params[1].cp = absolute_path;
247 tests[1].tests[1].params[2].m = 33190; /* mode 646 translated */
248 tests[1].tests[1].params[3].i = 123; /* invalid flag */
249 tests[1].tests[2].result = ENOTDIR;
250 tests[1].tests[2].params[0].i = notd_fd;
251 tests[1].tests[2].params[1].cp = relative_file;
252 tests[1].tests[2].params[2].m = 33190;
253 tests[1].tests[2].params[3].i = 0;
254 tests[1].tests[3].result = 0;
255 tests[1].tests[3].params[0].i = notd_fd;
256 tests[1].tests[3].params[1].cp = absolute_file;
257 tests[1].tests[3].params[2].m = 33190;
258 tests[1].tests[3].params[3].i = 0;
259 tests[1].tests[4].result = 0;
260 tests[1].tests[4].params[0].i = AT_FDCWD;
261 tests[1].tests[4].params[1].cp = symlinkf;
262 tests[1].tests[4].params[2].m = 33190;
263 tests[1].tests[4].params[3].i = AT_SYMLINK_NOFOLLOW;
264 tests[1].tests[5].result = 0;
265 tests[1].tests[5].params[0].i = rel_fd;
266 tests[1].tests[5].params[1].cp = file;
267 tests[1].tests[5].params[2].m = 33190;
268 tests[1].tests[5].params[3].i = 0;
269
270 /* fchownat */
271 tests[2].syscall = SYS_fchownat;
272 tests[2].num_of_cases = 6;
273 tests[2].name = "fchownat";
274 tests[2].tests[0].result = EBADF;
275 tests[2].tests[0].params[0].i = 106; /* invalid fd */
276 tests[2].tests[0].params[1].cp = relative_file;
277 tests[2].tests[0].params[2].u = 65534;
278 tests[2].tests[0].params[3].g = 65534;
279 tests[2].tests[0].params[4].i = 0;
280 tests[2].tests[1].result = EINVAL;
281 tests[2].tests[1].params[0].i = rel_fd;
282 tests[2].tests[1].params[1].cp = file;
283 tests[2].tests[1].params[2].u = 65534;
284 tests[2].tests[1].params[3].g = 65534;
285 tests[2].tests[1].params[4].i = 123; /* invalid flag */
286 tests[2].tests[2].result = ENOTDIR;
287 tests[2].tests[2].params[0].i = notd_fd;
288 tests[2].tests[2].params[1].cp = relative_file;
289 tests[2].tests[2].params[2].u = 65534;
290 tests[2].tests[2].params[3].g = 65534;
291 tests[2].tests[2].params[4].i = 0;
292 tests[2].tests[3].result = 0;
293 tests[2].tests[3].params[0].i = notd_fd;
294 tests[2].tests[3].params[1].cp = absolute_file;
295 tests[2].tests[3].params[2].u = 65534;
296 tests[2].tests[3].params[3].g = 65534;
297 tests[2].tests[3].params[4].i = 0;
298 tests[2].tests[4].result = 0;
299 tests[2].tests[4].params[0].i = AT_FDCWD;
300 tests[2].tests[4].params[1].cp = symlinkf;
301 tests[2].tests[4].params[2].u = 65534;
302 tests[2].tests[4].params[3].g = 65534;
303 tests[2].tests[4].params[4].i = AT_SYMLINK_NOFOLLOW;
304 tests[2].tests[5].result = 0;
305 tests[2].tests[5].params[0].i = rel_fd;
306 tests[2].tests[5].params[1].cp = file;
307 tests[2].tests[5].params[2].u = 0;
308 tests[2].tests[5].params[3].g = 0;
309 tests[2].tests[5].params[4].i = 0;
310
311 /* fstatat */
312 tests[3].syscall = SYS_fstatat;
313 tests[3].num_of_cases = 5;
314 tests[3].name = "fstatat";
315 tests[3].tests[0].result = EBADF;
316 tests[3].tests[0].params[0].i = 106; /* invalid fd */
317 tests[3].tests[0].params[1].cp = relative_file;
318 tests[3].tests[0].params[2].vp = &buf;
319 tests[3].tests[0].params[3].i = 0;
320 tests[3].tests[1].result = EINVAL;
321 tests[3].tests[1].params[0].i = rel_fd;
322 tests[3].tests[1].params[1].cp = relative_file;
323 tests[3].tests[1].params[2].vp = &buf;
324 tests[3].tests[1].params[3].i = 123; /* invalid flags */
325 tests[3].tests[2].result = ENOTDIR;
326 tests[3].tests[2].params[0].i = notd_fd;
327 tests[3].tests[2].params[1].cp = relative_file;
328 tests[3].tests[2].params[2].vp = &buf;
329 tests[3].tests[2].params[3].i = 0;
330 tests[3].tests[2].result = 0;
331 tests[3].tests[2].params[0].i = rel_fd;
332 tests[3].tests[2].params[1].cp = file;
333 tests[3].tests[2].params[2].vp = &buf;
334 tests[3].tests[2].params[3].i = 0;
335 tests[3].tests[3].result = 0;
336 tests[3].tests[3].params[0].i = AT_FDCWD;
337 tests[3].tests[3].params[1].cp = symlinkf;
338 tests[3].tests[3].params[2].vp = &buf;
339 tests[3].tests[3].params[3].i = AT_SYMLINK_NOFOLLOW;
340 tests[3].tests[4].result = 0;
341 tests[3].tests[4].params[0].i = notd_fd;
342 tests[3].tests[4].params[1].cp = absolute_file;
343 tests[3].tests[4].params[2].vp = &buf;
344 tests[3].tests[4].params[3].i = 0;
345
346 /* futimesat */
347 tests[4].syscall = SYS_futimesat;
348 tests[4].num_of_cases = 4;
349 tests[4].name = "futimesat";
350 tests[4].tests[0].result = EBADF;
351 tests[4].tests[0].params[0].i = 106; /* invalid fd */
352 tests[4].tests[0].params[1].cp = relative_file;
353 tests[4].tests[0].params[2].vp = times;
354 tests[4].tests[1].result = ENOTDIR;
355 tests[4].tests[1].params[0].i = notd_fd;
356 tests[4].tests[1].params[1].cp = relative_file;
357 tests[4].tests[1].params[2].vp = times;
358 tests[4].tests[2].result = 0;
359 tests[4].tests[2].params[0].i = rel_fd;
360 tests[4].tests[2].params[1].cp = file;
361 tests[4].tests[2].params[2].vp = times;
362 tests[4].tests[3].result = 0;
363 tests[4].tests[3].params[0].i = notd_fd;
364 tests[4].tests[3].params[1].cp = absolute_file;
365 tests[4].tests[3].params[2].vp = times;
366
367 /* linkat */
368 tests[5].syscall = SYS_linkat;
369 tests[5].num_of_cases = 7;
370 tests[5].name = "linkat";
371 tests[5].tests[0].result = EBADF;
372 tests[5].tests[0].params[0].i = 106; /* invalid fd */
373 tests[5].tests[0].params[1].cp = relative_file;
374 tests[5].tests[0].params[2].i = AT_FDCWD;
375 tests[5].tests[0].params[3].cp = newlink;
376 tests[5].tests[0].params[4].i = 0;
377 tests[5].tests[1].result = EBADF;
378 tests[5].tests[1].params[0].i = AT_FDCWD;
379 tests[5].tests[1].params[1].cp = relative_file;
380 tests[5].tests[1].params[2].i = 106; /* invalid fd */
381 tests[5].tests[1].params[3].cp = newlink;
382 tests[5].tests[1].params[4].i = 0;
383 tests[5].tests[2].result = EINVAL;
384 tests[5].tests[2].params[0].i = rel_fd;
385 tests[5].tests[2].params[1].cp = relative_file;
386 tests[5].tests[2].params[2].i = AT_FDCWD;
387 tests[5].tests[2].params[3].cp = newlink;
388 tests[5].tests[2].params[4].i = 123; /* invalid flag */
389 tests[5].tests[3].result = ENOTDIR;
390 tests[5].tests[3].params[0].i = notd_fd;
391 tests[5].tests[3].params[1].cp = relative_file;
392 tests[5].tests[3].params[2].i = AT_FDCWD;
393 tests[5].tests[3].params[3].cp = newlink;
394 tests[5].tests[3].params[4].i = 0;
395 tests[5].tests[4].result = 0;
396 tests[5].tests[4].params[0].i = rel_fd;
397 tests[5].tests[4].params[1].cp = file;
398 tests[5].tests[4].params[2].i = rel_fd;
399 tests[5].tests[4].params[3].cp = newlink;
400 tests[5].tests[4].params[4].i = 0;
401 tests[5].tests[5].result = 0;
402 tests[5].tests[5].params[0].i = AT_FDCWD;
403 tests[5].tests[5].params[1].cp = symlinkf;
404 tests[5].tests[5].params[2].i = rel_fd;
405 tests[5].tests[5].params[3].cp = newlink2;
406 tests[5].tests[5].params[4].i = 0;
407 tests[5].tests[6].result = 0;
408 tests[5].tests[6].params[0].i = AT_FDCWD;
409 tests[5].tests[6].params[1].cp = symlinkf;
410 tests[5].tests[6].params[2].i = rel_fd;
411 tests[5].tests[6].params[3].cp = newlink3;
412 tests[5].tests[6].params[4].i = AT_SYMLINK_FOLLOW;
413
414 /* mkdirat */
415 tests[6].syscall = SYS_mkdirat;
416 tests[6].num_of_cases = 3;
417 tests[6].name = "mkdirat";
418 tests[6].tests[0].result = EBADF;
419 tests[6].tests[0].params[0].i = 106; /* invalid fd */
420 tests[6].tests[0].params[1].cp = relative_file;
421 tests[6].tests[0].params[2].m = 33190;
422 tests[6].tests[1].result = ENOTDIR;
423 tests[6].tests[1].params[0].i = notd_fd;
424 tests[6].tests[1].params[1].cp = relative_file;
425 tests[6].tests[1].params[2].m = 33190;
426 tests[6].tests[2].result = 0;
427 tests[6].tests[2].params[0].i = rel_fd;
428 tests[6].tests[2].params[1].cp = newdir;
429 tests[6].tests[2].params[2].m = 33190;
430
431 /* mkfifoat */
432 tests[7].syscall = SYS_mkfifoat;
433 tests[7].num_of_cases = 3;
434 tests[7].name = "mkfifoat";
435 tests[7].tests[0].result = EBADF;
436 tests[7].tests[0].params[0].i = 107; /* invalid fd */
437 tests[7].tests[0].params[1].cp = relative_file;
438 tests[7].tests[0].params[2].m = 33190;
439 tests[7].tests[1].result = ENOTDIR;
440 tests[7].tests[1].params[0].i = notd_fd;
441 tests[7].tests[1].params[1].cp = relative_file;
442 tests[7].tests[1].params[2].m = 33190;
443 tests[7].tests[2].result = 0;
444 tests[7].tests[2].params[0].i = rel_fd;
445 tests[7].tests[2].params[1].cp = fifo;
446 tests[7].tests[2].params[2].m = 33190;
447
448 /* mknodat */
449 tests[8].syscall = SYS_mknodat;
450 tests[8].num_of_cases = 3;
451 tests[8].name = "mknodat";
452 tests[8].tests[0].result = EBADF;
453 tests[8].tests[0].params[0].i = 108; /* invalid fd */
454 tests[8].tests[0].params[1].cp = relative_file;
455 tests[8].tests[0].params[2].m = 0666 | S_IFCHR;
456 tests[8].tests[0].params[3].d = 15;
457 tests[8].tests[1].result = ENOTDIR;
458 tests[8].tests[1].params[0].i = notd_fd;
459 tests[8].tests[1].params[1].cp = relative_file;
460 tests[8].tests[1].params[2].m = 0666 | S_IFCHR;
461 tests[8].tests[1].params[3].d = 15;
462 tests[8].tests[2].result = 0;
463 tests[8].tests[2].params[0].i = rel_fd;
464 tests[8].tests[2].params[1].cp = nod;
465 tests[8].tests[2].params[2].m = 0666 | S_IFCHR;
466 tests[8].tests[2].params[3].d = 2570;
467
468 /* openat */
469 tests[9].syscall = SYS_openat;
470 tests[9].num_of_cases = 5;
471 tests[9].name = "openat";
472 tests[9].tests[0].result = EBADF;
473 tests[9].tests[0].params[0].i = 106; /* invalid fd */
474 tests[9].tests[0].params[1].cp = relative_file;
475 tests[9].tests[0].params[2].i = O_RDONLY;
476 tests[9].tests[0].params[3].i = 0666;
477 tests[9].tests[1].result = ENOTDIR;
478 tests[9].tests[1].params[0].i = notd_fd;
479 tests[9].tests[1].params[1].cp = relative_file;
480 tests[9].tests[1].params[2].i = O_RDONLY;
481 tests[9].tests[1].params[3].i = 0666;
482 tests[9].tests[2].result = 8; /* hardcoded fd */
483 tests[9].tests[2].params[0].i = rel_fd;
484 tests[9].tests[2].params[1].cp = file;
485 tests[9].tests[2].params[2].i = O_RDONLY;
486 tests[9].tests[2].params[3].i = 0400;
487 tests[9].tests[3].result = 9; /* hardcoded fd */
488 tests[9].tests[3].params[0].i = notd_fd;
489 tests[9].tests[3].params[1].cp = absolute_file;
490 tests[9].tests[3].params[2].i = O_RDONLY;
491 tests[9].tests[3].params[3].i = 0400;
492 tests[9].tests[4].result = 10; /* hardcoded fd */
493 tests[9].tests[4].params[0].i = rel_fd;
494 tests[9].tests[4].params[1].cp = newfile;
495 tests[9].tests[4].params[2].i = O_RDONLY | O_CREAT;
496 tests[9].tests[4].params[3].i = 0666;
497
498 /* readlinkat */
499 tests[10].syscall = SYS_readlinkat;
500 tests[10].num_of_cases = 3;
501 tests[10].name = "readlinkat";
502 tests[10].tests[0].result = EBADF;
503 tests[10].tests[0].params[0].i = 106; /* invalid fd */
504 tests[10].tests[0].params[1].cp = relative_file;
505 tests[10].tests[0].params[2].vp = cbuf;
506 tests[10].tests[0].params[3].i = PATH_MAX;
507 tests[10].tests[1].result = ENOTDIR;
508 tests[10].tests[1].params[0].i = notd_fd;
509 tests[10].tests[1].params[1].cp = relative_file;
510 tests[10].tests[1].params[2].vp = cbuf;
511 tests[10].tests[1].params[3].i = PATH_MAX;
512 tests[10].tests[2].result = strlen(absolute_file);
513 tests[10].tests[2].params[0].i = AT_FDCWD;
514 tests[10].tests[2].params[1].cp = symlinkf;
515 tests[10].tests[2].params[2].vp = cbuf;
516 tests[10].tests[2].params[3].i = PATH_MAX;
517
518 /* renameat */
519 tests[11].syscall = SYS_renameat;
520 tests[11].num_of_cases = 5;
521 tests[11].name = "renameat";
522 tests[11].tests[0].result = EBADF;
523 tests[11].tests[0].params[0].i = 106; /* invalid fd */
524 tests[11].tests[0].params[1].cp = file;
525 tests[11].tests[0].params[2].i = rel_fd;
526 tests[11].tests[0].params[3].cp = file;
527 tests[11].tests[1].result = EBADF;
528 tests[11].tests[1].params[0].i = rel_fd;
529 tests[11].tests[1].params[1].cp = file;
530 tests[11].tests[1].params[2].i = 106; /* invalid fd */
531 tests[11].tests[1].params[3].cp = file;
532 tests[11].tests[2].result = ENOTDIR;
533 tests[11].tests[2].params[0].i = notd_fd;
534 tests[11].tests[2].params[1].cp = relative_file;
535 tests[11].tests[2].params[2].i = rel_fd;
536 tests[11].tests[2].params[3].cp = file;
537 tests[11].tests[3].result = ENOTDIR;
538 tests[11].tests[3].params[0].i = rel_fd;
539 tests[11].tests[3].params[1].cp = file;
540 tests[11].tests[3].params[2].i = notd_fd;
541 tests[11].tests[3].params[3].cp = relative_file;
542 tests[11].tests[4].result = 0;
543 tests[11].tests[4].params[0].i = rel_fd;
544 tests[11].tests[4].params[1].cp = newfile;
545 tests[11].tests[4].params[2].i = AT_FDCWD;
546 tests[11].tests[4].params[3].cp = newfile;
547
548 /* symlinkat */
549 tests[12].syscall = SYS_symlinkat;
550 tests[12].num_of_cases = 3;
551 tests[12].name = "symlinkat";
552 tests[12].tests[0].result = EBADF;
553 tests[12].tests[0].params[0].cp = file;
554 tests[12].tests[0].params[1].i = 106; /* invalid fd */
555 tests[12].tests[0].params[2].cp = file;
556 tests[12].tests[1].result = ENOTDIR;
557 tests[12].tests[1].params[0].cp = file;
558 tests[12].tests[1].params[1].i = notd_fd;
559 tests[12].tests[1].params[2].cp = relative_file;
560 tests[12].tests[2].result = 0;
561 tests[12].tests[2].params[0].cp = absolute_file;
562 tests[12].tests[2].params[1].i = rel_fd;
563 tests[12].tests[2].params[2].cp = newslink;
564
565
566 /* unlinkat */
567 tests[13].syscall = SYS_unlinkat;
568 tests[13].num_of_cases = 7;
569 tests[13].name = "unlinkat";
570 tests[13].tests[0].result = EBADF;
571 tests[13].tests[0].params[0].i = 106; /* invalid fd */
572 tests[13].tests[0].params[1].cp = relative_file;
573 tests[13].tests[0].params[2].i = 0;
574 tests[13].tests[1].result = ENOTDIR;
575 tests[13].tests[1].params[0].i = notd_fd;
576 tests[13].tests[1].params[1].cp = relative_file;
577 tests[13].tests[1].params[2].i = 0;
578 tests[13].tests[2].result = EINVAL;
579 tests[13].tests[2].params[0].i = rel_fd;
580 tests[13].tests[2].params[1].cp = file;
581 tests[13].tests[2].params[2].i = 123; /* invalid flag */
582 tests[13].tests[3].result = ENOTDIR;
583 tests[13].tests[3].params[0].i = rel_fd;
584 tests[13].tests[3].params[1].cp = not_dir_path;
585 tests[13].tests[3].params[2].i = AT_REMOVEDIR;
586 tests[13].tests[4].result = ENOTEMPTY;
587 tests[13].tests[4].params[0].i = AT_FDCWD;
588 tests[13].tests[4].params[1].cp = relative_path;
589 tests[13].tests[4].params[2].i = AT_REMOVEDIR;
590 tests[13].tests[5].result = 0;
591 tests[13].tests[5].params[0].i = rel_fd;
592 tests[13].tests[5].params[1].cp = newdir;
593 tests[13].tests[5].params[2].i = AT_REMOVEDIR;
594 tests[13].tests[6].result = 0;
595 tests[13].tests[6].params[0].i = AT_FDCWD;
596 tests[13].tests[6].params[1].cp = newfile;
597 tests[13].tests[6].params[2].i = 0;
598
599
600 /* fexecve */
601 tests[14].syscall = SYS_fexecve;
602 tests[14].num_of_cases = 2;
603 tests[14].name = "fexecve";
604 tests[14].tests[0].result = EBADF;
605 tests[14].tests[0].params[0].i = 106; /* invalid fd */
606 tests[14].tests[0].params[1].cpp = pargv;
607 tests[14].tests[0].params[2].cpp = NULL;
608 /* This is EXPECTED to execve /bin/date, so dont expect OK output */
609 tests[14].tests[1].result = 0;
610 tests[14].tests[1].params[0].i = exec_fd;
611 tests[14].tests[1].params[1].cpp = pargv;
612 tests[14].tests[1].params[2].cpp = NULL;
613 }
614
615 void
cleanup(void)616 cleanup(void)
617 {
618 system("/bin/sh -c 'rm -rf tmp'");
619 }
620
621 void
setup_once(void)622 setup_once(void)
623 {
624 }
625
626 int
main(int argc,char * argv[])627 main(int argc, char *argv[])
628 {
629 int i,j;
630 int error;
631
632 (void)argc;
633 (void)argv;
634
635 setup();
636
637 for (i = 0; i < NUM_OF_TESTS; i++) {
638 printf("\nTest: %s\n", tests[i].name);
639 for (j = 0; j < tests[i].num_of_cases; j++) {
640 error = syscall(tests[i].syscall,
641 tests[i].tests[j].params[0],
642 tests[i].tests[j].params[1],
643 tests[i].tests[j].params[2],
644 tests[i].tests[j].params[3],
645 tests[i].tests[j].params[4]);
646 if (error == 0) {
647 if (tests[i].tests[j].result == 0)
648 printf("#%i ... OK\n", j);
649 else {
650 printf("#%i ... BAD: ", j);
651 printf("expected %i, but got %i\n", tests[i].tests[j].result, error);
652 }
653 } else {
654 if (tests[i].tests[j].result == errno)
655 printf("#%i ... OK\n", j);
656 else {
657 if (error != tests[i].tests[j].result) {
658 printf("#%i ... BAD: ", j);
659 printf("expected %i, but got %i\n", tests[i].tests[j].result, error);
660 } else
661 printf("#%i ... OK\n", j);
662 }
663 }
664 }
665 }
666
667 cleanup();
668
669 return (0);
670 }
671