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