1179084Srdivacky/*- 2179084Srdivacky * Copyright (c) 2007 Roman Divacky 3179084Srdivacky * All rights reserved. 4179084Srdivacky * 5179084Srdivacky * Redistribution and use in source and binary forms, with or without 6179084Srdivacky * modification, are permitted provided that the following conditions 7179084Srdivacky * are met: 8179084Srdivacky * 1. Redistributions of source code must retain the above copyright 9179084Srdivacky * notice, this list of conditions and the following disclaimer. 10179084Srdivacky * 2. Redistributions in binary form must reproduce the above copyright 11179084Srdivacky * notice, this list of conditions and the following disclaimer in the 12179084Srdivacky * documentation and/or other materials provided with the distribution. 13179084Srdivacky * 14179084Srdivacky * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15179084Srdivacky * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16179084Srdivacky * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17179084Srdivacky * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18179084Srdivacky * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19179084Srdivacky * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20179084Srdivacky * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21179084Srdivacky * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22179084Srdivacky * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23179084Srdivacky * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24179084Srdivacky * SUCH DAMAGE. 25179084Srdivacky * 26179084Srdivacky * $FreeBSD$ 27179084Srdivacky */ 28179084Srdivacky 29219568Sbrucec#include <sys/types.h> 30219568Sbrucec#include <sys/syscall.h> 31219568Sbrucec#include <sys/stat.h> 32219568Sbrucec 33179084Srdivacky#include <errno.h> 34179084Srdivacky#include <fcntl.h> 35179084Srdivacky#include <stdbool.h> 36179084Srdivacky#include <stdio.h> 37179084Srdivacky#include <stdlib.h> 38179084Srdivacky#include <string.h> 39219568Sbrucec#include <unistd.h> 40179084Srdivacky 41219568Sbrucecvoid cleanup(void); 42219568Sbrucecvoid setup(void); 43219568Sbrucecvoid setup_once(void); 44219568Sbrucec 45179084Srdivackyunion param { 46179084Srdivacky int i; 47219568Sbrucec const char *cp; 48179084Srdivacky mode_t m; 49179084Srdivacky dev_t d; 50179084Srdivacky void *vp; 51179084Srdivacky uid_t u; 52179084Srdivacky gid_t g; 53219568Sbrucec const char **cpp; 54179084Srdivacky}; 55179084Srdivacky 56179084Srdivackystruct testcase { 57179084Srdivacky int result; 58179084Srdivacky union param params[5]; /* no *at syscall with more than 5 params */ 59179084Srdivacky}; 60179084Srdivacky 61179084Srdivackystruct test { 62179084Srdivacky int syscall; 63179084Srdivacky int num_of_cases; 64219568Sbrucec const char *name; 65179084Srdivacky struct testcase tests[10]; /* no more than 10 tests */ 66179084Srdivacky 67179084Srdivacky}; 68179084Srdivacky 69179084Srdivackystruct test *tests; 70179084Srdivacky#define NUM_OF_TESTS 14 /* we dont want the fexecve test to run */ 71179084Srdivacky 72179084Srdivackychar *absolute_path = NULL; 73219568Sbrucecconst char *relative_path = "tmp/"; 74219568Sbrucecconst char *not_dir_path = "/bin/date"; 75179084Srdivacky 76219568Sbrucecconst char *file = "foo"; 77179084Srdivackychar *absolute_file = NULL; 78179084Srdivackychar *relative_file = NULL; 79219568Sbrucecconst char *symlinkf = "link"; 80219568Sbrucecconst char *newlink = "nlink1"; 81219568Sbrucecconst char *newlink2 = "nlink2"; 82219568Sbrucecconst char *newlink3 = "nlink3"; 83219568Sbrucecconst char *newdir = "newdir"; 84219568Sbrucecconst char *fifo = "fifo"; 85219568Sbrucecconst char *nod = "nod"; 86219568Sbrucecconst char *newfile = "newfile"; 87219568Sbrucecconst char *newslink = "nslink1"; 88179084Srdivacky 89179084Srdivackybool dir_exist = false; 90179084Srdivackybool file_exist = false; 91179084Srdivackybool link_exist = false; 92179084Srdivacky 93179084Srdivackyint rel_fd, abs_fd, notd_fd, exec_fd; 94179084Srdivacky 95179084Srdivackystruct timeval times[2]; 96179084Srdivackystruct stat buf; 97219568Sbrucecconst char *pargv[2] = { "/bin/date", NULL }; 98179084Srdivacky#define PATH_MAX 1024 99179084Srdivackychar cbuf[PATH_MAX]; 100179084Srdivacky 101179084Srdivackyvoid 102219568Sbrucecsetup(void) 103179084Srdivacky{ 104179084Srdivacky int i, error; 105179084Srdivacky struct stat sb; 106231786Sjilles size_t len; 107179084Srdivacky 108231786Sjilles tests = calloc(NUM_OF_TESTS + 1, sizeof(struct test)); 109179084Srdivacky if (tests == NULL) { 110179084Srdivacky perror(""); 111179084Srdivacky exit(0); 112179084Srdivacky } 113179084Srdivacky 114179084Srdivacky absolute_path = (char *)getcwd(NULL, 0); 115179084Srdivacky if (absolute_path == NULL) { 116179084Srdivacky perror("getcwd"); 117179084Srdivacky exit(0); 118179084Srdivacky } 119179084Srdivacky 120231786Sjilles len = strlen(absolute_path); 121231786Sjilles absolute_path = realloc(absolute_path, 122231786Sjilles len + 1 + strlen(relative_path) + 1); 123179084Srdivacky if (absolute_path == NULL) { 124179084Srdivacky perror("realloc"); 125179084Srdivacky exit(0); 126179084Srdivacky } 127179084Srdivacky 128231786Sjilles absolute_path[len] = '/'; 129231786Sjilles strcpy(absolute_path + len + 1, relative_path); 130179084Srdivacky 131179084Srdivacky absolute_file = malloc(strlen(absolute_path) + 1 + strlen(file)); 132179084Srdivacky bzero(absolute_file, strlen(absolute_path) + 1 + strlen(file)); 133179084Srdivacky if (absolute_file == NULL) { 134179084Srdivacky perror("malloc"); 135179084Srdivacky exit(0); 136179084Srdivacky } 137179084Srdivacky strcpy(absolute_file, absolute_path); 138179084Srdivacky absolute_file[strlen(absolute_file)] = '/'; 139179084Srdivacky strcpy(absolute_file + strlen(absolute_path), file); 140179084Srdivacky 141179084Srdivacky relative_file = malloc(strlen(relative_path) + 1 + strlen(file)); 142179084Srdivacky bzero(relative_file, strlen(relative_path) + 1 + strlen(file)); 143179084Srdivacky if (relative_file == NULL) { 144179084Srdivacky perror("malloc"); 145179084Srdivacky exit(0); 146179084Srdivacky } 147179084Srdivacky strcpy(relative_file, relative_path); 148179084Srdivacky relative_file[strlen(relative_file)] = '/'; 149179084Srdivacky strcpy(relative_file + strlen(relative_path), file); 150179084Srdivacky 151231786Sjilles error = mkdir(relative_path, 0700); 152179084Srdivacky dir_exist = (errno == EEXIST); 153179084Srdivacky if (error && errno != EEXIST) { 154179084Srdivacky perror("tmp"); 155179084Srdivacky exit(0); 156179084Srdivacky } 157179084Srdivacky 158179084Srdivacky error = stat("tmp/foo", &sb); 159179084Srdivacky file_exist = (errno != ENOENT); 160231786Sjilles i = open("tmp/foo", O_RDONLY | O_CREAT, 0666); 161179084Srdivacky if (i == -1) { 162179084Srdivacky perror("foo"); 163179084Srdivacky exit(0); 164179084Srdivacky } 165179084Srdivacky 166179084Srdivacky rel_fd = open(relative_path, O_RDONLY); 167179084Srdivacky if (rel_fd == -1) { 168179084Srdivacky perror("relative path"); 169179084Srdivacky exit(0); 170179084Srdivacky } 171179084Srdivacky 172179084Srdivacky abs_fd = open(absolute_path, O_RDONLY); 173179084Srdivacky if (abs_fd == -1) { 174179084Srdivacky perror("absolute path"); 175179084Srdivacky exit(0); 176179084Srdivacky } 177179084Srdivacky 178179084Srdivacky notd_fd = open(not_dir_path, O_RDONLY); 179179084Srdivacky if (notd_fd == -1) { 180179084Srdivacky perror("not a directory"); 181179084Srdivacky exit(0); 182179084Srdivacky } 183179084Srdivacky 184179084Srdivacky exec_fd = open(not_dir_path, O_RDONLY); 185179084Srdivacky if (exec_fd == -1) { 186179084Srdivacky perror("not a directory"); 187179084Srdivacky exit(0); 188179084Srdivacky } 189179084Srdivacky 190179084Srdivacky error = symlink(absolute_file, symlinkf); 191179084Srdivacky link_exist = (errno == EEXIST); 192179084Srdivacky if (error && errno != EEXIST) { 193179084Srdivacky perror("symlink"); 194179084Srdivacky exit(0); 195179084Srdivacky } 196179084Srdivacky 197179084Srdivacky /* faccessat */ 198179084Srdivacky tests[0].syscall = SYS_faccessat; 199179084Srdivacky tests[0].num_of_cases = 6; 200179084Srdivacky tests[0].name = "faccessat"; 201179084Srdivacky tests[0].tests[0].result = EBADF; 202179084Srdivacky tests[0].tests[0].params[0].i = 106; /* invalid fd */ 203179084Srdivacky tests[0].tests[0].params[1].cp = relative_path; 204179084Srdivacky tests[0].tests[0].params[2].m = 0; 205179084Srdivacky tests[0].tests[0].params[3].i = 0; 206179084Srdivacky tests[0].tests[1].result = EBADF; 207179084Srdivacky tests[0].tests[1].params[0].i = 106; /* invalid fd */ 208179084Srdivacky tests[0].tests[1].params[1].cp = relative_path; 209179084Srdivacky tests[0].tests[1].params[2].m = 0; 210179084Srdivacky tests[0].tests[1].params[3].i = AT_EACCESS; 211179084Srdivacky tests[0].tests[2].result = EINVAL; 212179084Srdivacky tests[0].tests[2].params[0].i = rel_fd; 213179084Srdivacky tests[0].tests[2].params[1].cp = absolute_path; 214179084Srdivacky tests[0].tests[2].params[2].m = 0; 215179084Srdivacky tests[0].tests[2].params[3].i = 123; /* invalid flag */ 216179084Srdivacky tests[0].tests[3].result = ENOTDIR; 217179084Srdivacky tests[0].tests[3].params[0].i = notd_fd; 218179084Srdivacky tests[0].tests[3].params[1].cp = relative_file; 219179084Srdivacky tests[0].tests[3].params[2].m = 0; 220179084Srdivacky tests[0].tests[3].params[3].i = 0; 221179084Srdivacky tests[0].tests[4].result = 0; 222179084Srdivacky tests[0].tests[4].params[0].i = rel_fd; 223179084Srdivacky tests[0].tests[4].params[1].cp = file; 224179084Srdivacky tests[0].tests[4].params[2].m = 0; 225179084Srdivacky tests[0].tests[4].params[3].i = 0; 226179084Srdivacky tests[0].tests[5].result = 0; 227179084Srdivacky tests[0].tests[5].params[0].i = rel_fd; 228179084Srdivacky tests[0].tests[5].params[1].cp = file; 229179084Srdivacky tests[0].tests[5].params[2].m = 0; 230179084Srdivacky tests[0].tests[5].params[3].i = AT_EACCESS; 231179084Srdivacky tests[0].tests[6].result = 0; 232179084Srdivacky tests[0].tests[6].params[0].i = 106; /* invalid fd */ 233179084Srdivacky tests[0].tests[6].params[1].cp = absolute_path; 234179084Srdivacky tests[0].tests[6].params[2].m = 0; 235179084Srdivacky tests[0].tests[6].params[3].i = 0; 236179084Srdivacky 237179084Srdivacky /* fchmodat */ 238179084Srdivacky tests[1].syscall = SYS_fchmodat; 239179084Srdivacky tests[1].num_of_cases = 6; 240179084Srdivacky tests[1].name = "fchmodat"; 241179084Srdivacky tests[1].tests[0].result = EBADF; 242179084Srdivacky tests[1].tests[0].params[0].i = 106; /* invalid fd */ 243179084Srdivacky tests[1].tests[0].params[1].cp = relative_path; 244179084Srdivacky tests[1].tests[0].params[2].m = 33190; 245179084Srdivacky tests[1].tests[0].params[3].i = 0; 246179084Srdivacky tests[1].tests[1].result = EINVAL; 247179084Srdivacky tests[1].tests[1].params[0].i = rel_fd; 248179084Srdivacky tests[1].tests[1].params[1].cp = absolute_path; 249179084Srdivacky tests[1].tests[1].params[2].m = 33190; /* mode 646 translated */ 250179084Srdivacky tests[1].tests[1].params[3].i = 123; /* invalid flag */ 251179084Srdivacky tests[1].tests[2].result = ENOTDIR; 252179084Srdivacky tests[1].tests[2].params[0].i = notd_fd; 253179084Srdivacky tests[1].tests[2].params[1].cp = relative_file; 254179084Srdivacky tests[1].tests[2].params[2].m = 33190; 255179084Srdivacky tests[1].tests[2].params[3].i = 0; 256179084Srdivacky tests[1].tests[3].result = 0; 257179084Srdivacky tests[1].tests[3].params[0].i = notd_fd; 258179084Srdivacky tests[1].tests[3].params[1].cp = absolute_file; 259179084Srdivacky tests[1].tests[3].params[2].m = 33190; 260179084Srdivacky tests[1].tests[3].params[3].i = 0; 261179084Srdivacky tests[1].tests[4].result = 0; 262179084Srdivacky tests[1].tests[4].params[0].i = AT_FDCWD; 263179084Srdivacky tests[1].tests[4].params[1].cp = symlinkf; 264179084Srdivacky tests[1].tests[4].params[2].m = 33190; 265179084Srdivacky tests[1].tests[4].params[3].i = AT_SYMLINK_NOFOLLOW; 266179084Srdivacky tests[1].tests[5].result = 0; 267179084Srdivacky tests[1].tests[5].params[0].i = rel_fd; 268179084Srdivacky tests[1].tests[5].params[1].cp = file; 269179084Srdivacky tests[1].tests[5].params[2].m = 33190; 270179084Srdivacky tests[1].tests[5].params[3].i = 0; 271179084Srdivacky 272179084Srdivacky /* fchownat */ 273179084Srdivacky tests[2].syscall = SYS_fchownat; 274179084Srdivacky tests[2].num_of_cases = 6; 275179084Srdivacky tests[2].name = "fchownat"; 276179084Srdivacky tests[2].tests[0].result = EBADF; 277179084Srdivacky tests[2].tests[0].params[0].i = 106; /* invalid fd */ 278179084Srdivacky tests[2].tests[0].params[1].cp = relative_file; 279179084Srdivacky tests[2].tests[0].params[2].u = 65534; 280179084Srdivacky tests[2].tests[0].params[3].g = 65534; 281179084Srdivacky tests[2].tests[0].params[4].i = 0; 282179084Srdivacky tests[2].tests[1].result = EINVAL; 283179084Srdivacky tests[2].tests[1].params[0].i = rel_fd; 284179084Srdivacky tests[2].tests[1].params[1].cp = file; 285179084Srdivacky tests[2].tests[1].params[2].u = 65534; 286179084Srdivacky tests[2].tests[1].params[3].g = 65534; 287179084Srdivacky tests[2].tests[1].params[4].i = 123; /* invalid flag */ 288179084Srdivacky tests[2].tests[2].result = ENOTDIR; 289179084Srdivacky tests[2].tests[2].params[0].i = notd_fd; 290179084Srdivacky tests[2].tests[2].params[1].cp = relative_file; 291179084Srdivacky tests[2].tests[2].params[2].u = 65534; 292179084Srdivacky tests[2].tests[2].params[3].g = 65534; 293179084Srdivacky tests[2].tests[2].params[4].i = 0; 294179084Srdivacky tests[2].tests[3].result = 0; 295179084Srdivacky tests[2].tests[3].params[0].i = notd_fd; 296179084Srdivacky tests[2].tests[3].params[1].cp = absolute_file; 297179084Srdivacky tests[2].tests[3].params[2].u = 65534; 298179084Srdivacky tests[2].tests[3].params[3].g = 65534; 299179084Srdivacky tests[2].tests[3].params[4].i = 0; 300179084Srdivacky tests[2].tests[4].result = 0; 301179084Srdivacky tests[2].tests[4].params[0].i = AT_FDCWD; 302179084Srdivacky tests[2].tests[4].params[1].cp = symlinkf; 303179084Srdivacky tests[2].tests[4].params[2].u = 65534; 304179084Srdivacky tests[2].tests[4].params[3].g = 65534; 305179084Srdivacky tests[2].tests[4].params[4].i = AT_SYMLINK_NOFOLLOW; 306179084Srdivacky tests[2].tests[5].result = 0; 307179084Srdivacky tests[2].tests[5].params[0].i = rel_fd; 308179084Srdivacky tests[2].tests[5].params[1].cp = file; 309179084Srdivacky tests[2].tests[5].params[2].u = 0; 310179084Srdivacky tests[2].tests[5].params[3].g = 0; 311179084Srdivacky tests[2].tests[5].params[4].i = 0; 312179084Srdivacky 313179084Srdivacky /* fstatat */ 314179084Srdivacky tests[3].syscall = SYS_fstatat; 315179084Srdivacky tests[3].num_of_cases = 5; 316179084Srdivacky tests[3].name = "fstatat"; 317179084Srdivacky tests[3].tests[0].result = EBADF; 318179084Srdivacky tests[3].tests[0].params[0].i = 106; /* invalid fd */ 319179084Srdivacky tests[3].tests[0].params[1].cp = relative_file; 320179084Srdivacky tests[3].tests[0].params[2].vp = &buf; 321179084Srdivacky tests[3].tests[0].params[3].i = 0; 322179084Srdivacky tests[3].tests[1].result = EINVAL; 323179084Srdivacky tests[3].tests[1].params[0].i = rel_fd; 324179084Srdivacky tests[3].tests[1].params[1].cp = relative_file; 325179084Srdivacky tests[3].tests[1].params[2].vp = &buf; 326179084Srdivacky tests[3].tests[1].params[3].i = 123; /* invalid flags */ 327179084Srdivacky tests[3].tests[2].result = ENOTDIR; 328179084Srdivacky tests[3].tests[2].params[0].i = notd_fd; 329179084Srdivacky tests[3].tests[2].params[1].cp = relative_file; 330179084Srdivacky tests[3].tests[2].params[2].vp = &buf; 331179084Srdivacky tests[3].tests[2].params[3].i = 0; 332179084Srdivacky tests[3].tests[2].result = 0; 333179084Srdivacky tests[3].tests[2].params[0].i = rel_fd; 334179084Srdivacky tests[3].tests[2].params[1].cp = file; 335179084Srdivacky tests[3].tests[2].params[2].vp = &buf; 336179084Srdivacky tests[3].tests[2].params[3].i = 0; 337179084Srdivacky tests[3].tests[3].result = 0; 338179084Srdivacky tests[3].tests[3].params[0].i = AT_FDCWD; 339179084Srdivacky tests[3].tests[3].params[1].cp = symlinkf; 340179084Srdivacky tests[3].tests[3].params[2].vp = &buf; 341179084Srdivacky tests[3].tests[3].params[3].i = AT_SYMLINK_NOFOLLOW; 342179084Srdivacky tests[3].tests[4].result = 0; 343179084Srdivacky tests[3].tests[4].params[0].i = notd_fd; 344179084Srdivacky tests[3].tests[4].params[1].cp = absolute_file; 345179084Srdivacky tests[3].tests[4].params[2].vp = &buf; 346179084Srdivacky tests[3].tests[4].params[3].i = 0; 347179084Srdivacky 348179084Srdivacky /* futimesat */ 349179084Srdivacky tests[4].syscall = SYS_futimesat; 350179084Srdivacky tests[4].num_of_cases = 4; 351179084Srdivacky tests[4].name = "futimesat"; 352179084Srdivacky tests[4].tests[0].result = EBADF; 353179084Srdivacky tests[4].tests[0].params[0].i = 106; /* invalid fd */ 354179084Srdivacky tests[4].tests[0].params[1].cp = relative_file; 355179084Srdivacky tests[4].tests[0].params[2].vp = times; 356179084Srdivacky tests[4].tests[1].result = ENOTDIR; 357179084Srdivacky tests[4].tests[1].params[0].i = notd_fd; 358179084Srdivacky tests[4].tests[1].params[1].cp = relative_file; 359179084Srdivacky tests[4].tests[1].params[2].vp = times; 360179084Srdivacky tests[4].tests[2].result = 0; 361179084Srdivacky tests[4].tests[2].params[0].i = rel_fd; 362179084Srdivacky tests[4].tests[2].params[1].cp = file; 363179084Srdivacky tests[4].tests[2].params[2].vp = times; 364179084Srdivacky tests[4].tests[3].result = 0; 365179084Srdivacky tests[4].tests[3].params[0].i = notd_fd; 366179084Srdivacky tests[4].tests[3].params[1].cp = absolute_file; 367179084Srdivacky tests[4].tests[3].params[2].vp = times; 368179084Srdivacky 369179084Srdivacky /* linkat */ 370179084Srdivacky tests[5].syscall = SYS_linkat; 371179084Srdivacky tests[5].num_of_cases = 7; 372179084Srdivacky tests[5].name = "linkat"; 373179084Srdivacky tests[5].tests[0].result = EBADF; 374179084Srdivacky tests[5].tests[0].params[0].i = 106; /* invalid fd */ 375179084Srdivacky tests[5].tests[0].params[1].cp = relative_file; 376179084Srdivacky tests[5].tests[0].params[2].i = AT_FDCWD; 377179084Srdivacky tests[5].tests[0].params[3].cp = newlink; 378179084Srdivacky tests[5].tests[0].params[4].i = 0; 379179084Srdivacky tests[5].tests[1].result = EBADF; 380179084Srdivacky tests[5].tests[1].params[0].i = AT_FDCWD; 381179084Srdivacky tests[5].tests[1].params[1].cp = relative_file; 382179084Srdivacky tests[5].tests[1].params[2].i = 106; /* invalid fd */ 383179084Srdivacky tests[5].tests[1].params[3].cp = newlink; 384179084Srdivacky tests[5].tests[1].params[4].i = 0; 385179084Srdivacky tests[5].tests[2].result = EINVAL; 386179084Srdivacky tests[5].tests[2].params[0].i = rel_fd; 387179084Srdivacky tests[5].tests[2].params[1].cp = relative_file; 388179084Srdivacky tests[5].tests[2].params[2].i = AT_FDCWD; 389179084Srdivacky tests[5].tests[2].params[3].cp = newlink; 390179084Srdivacky tests[5].tests[2].params[4].i = 123; /* invalid flag */ 391179084Srdivacky tests[5].tests[3].result = ENOTDIR; 392179084Srdivacky tests[5].tests[3].params[0].i = notd_fd; 393179084Srdivacky tests[5].tests[3].params[1].cp = relative_file; 394179084Srdivacky tests[5].tests[3].params[2].i = AT_FDCWD; 395179084Srdivacky tests[5].tests[3].params[3].cp = newlink; 396179084Srdivacky tests[5].tests[3].params[4].i = 0; 397179084Srdivacky tests[5].tests[4].result = 0; 398179084Srdivacky tests[5].tests[4].params[0].i = rel_fd; 399179084Srdivacky tests[5].tests[4].params[1].cp = file; 400179084Srdivacky tests[5].tests[4].params[2].i = rel_fd; 401179084Srdivacky tests[5].tests[4].params[3].cp = newlink; 402179084Srdivacky tests[5].tests[4].params[4].i = 0; 403179084Srdivacky tests[5].tests[5].result = 0; 404179084Srdivacky tests[5].tests[5].params[0].i = AT_FDCWD; 405179084Srdivacky tests[5].tests[5].params[1].cp = symlinkf; 406179084Srdivacky tests[5].tests[5].params[2].i = rel_fd; 407179084Srdivacky tests[5].tests[5].params[3].cp = newlink2; 408179084Srdivacky tests[5].tests[5].params[4].i = 0; 409179084Srdivacky tests[5].tests[6].result = 0; 410179084Srdivacky tests[5].tests[6].params[0].i = AT_FDCWD; 411179084Srdivacky tests[5].tests[6].params[1].cp = symlinkf; 412179084Srdivacky tests[5].tests[6].params[2].i = rel_fd; 413179084Srdivacky tests[5].tests[6].params[3].cp = newlink3; 414179084Srdivacky tests[5].tests[6].params[4].i = AT_SYMLINK_FOLLOW; 415179084Srdivacky 416179084Srdivacky /* mkdirat */ 417179084Srdivacky tests[6].syscall = SYS_mkdirat; 418179084Srdivacky tests[6].num_of_cases = 3; 419179084Srdivacky tests[6].name = "mkdirat"; 420179084Srdivacky tests[6].tests[0].result = EBADF; 421179084Srdivacky tests[6].tests[0].params[0].i = 106; /* invalid fd */ 422179084Srdivacky tests[6].tests[0].params[1].cp = relative_file; 423179084Srdivacky tests[6].tests[0].params[2].m = 33190; 424179084Srdivacky tests[6].tests[1].result = ENOTDIR; 425179084Srdivacky tests[6].tests[1].params[0].i = notd_fd; 426179084Srdivacky tests[6].tests[1].params[1].cp = relative_file; 427179084Srdivacky tests[6].tests[1].params[2].m = 33190; 428179084Srdivacky tests[6].tests[2].result = 0; 429179084Srdivacky tests[6].tests[2].params[0].i = rel_fd; 430179084Srdivacky tests[6].tests[2].params[1].cp = newdir; 431179084Srdivacky tests[6].tests[2].params[2].m = 33190; 432179084Srdivacky 433179084Srdivacky /* mkfifoat */ 434179084Srdivacky tests[7].syscall = SYS_mkfifoat; 435179084Srdivacky tests[7].num_of_cases = 3; 436179084Srdivacky tests[7].name = "mkfifoat"; 437179084Srdivacky tests[7].tests[0].result = EBADF; 438179084Srdivacky tests[7].tests[0].params[0].i = 107; /* invalid fd */ 439179084Srdivacky tests[7].tests[0].params[1].cp = relative_file; 440179084Srdivacky tests[7].tests[0].params[2].m = 33190; 441179084Srdivacky tests[7].tests[1].result = ENOTDIR; 442179084Srdivacky tests[7].tests[1].params[0].i = notd_fd; 443179084Srdivacky tests[7].tests[1].params[1].cp = relative_file; 444179084Srdivacky tests[7].tests[1].params[2].m = 33190; 445179084Srdivacky tests[7].tests[2].result = 0; 446179084Srdivacky tests[7].tests[2].params[0].i = rel_fd; 447179084Srdivacky tests[7].tests[2].params[1].cp = fifo; 448179084Srdivacky tests[7].tests[2].params[2].m = 33190; 449179084Srdivacky 450179084Srdivacky /* mknodat */ 451179084Srdivacky tests[8].syscall = SYS_mknodat; 452179084Srdivacky tests[8].num_of_cases = 3; 453179084Srdivacky tests[8].name = "mknodat"; 454179084Srdivacky tests[8].tests[0].result = EBADF; 455179084Srdivacky tests[8].tests[0].params[0].i = 108; /* invalid fd */ 456179084Srdivacky tests[8].tests[0].params[1].cp = relative_file; 457179084Srdivacky tests[8].tests[0].params[2].m = 0666 | S_IFCHR; 458179084Srdivacky tests[8].tests[0].params[3].d = 15; 459179084Srdivacky tests[8].tests[1].result = ENOTDIR; 460179084Srdivacky tests[8].tests[1].params[0].i = notd_fd; 461179084Srdivacky tests[8].tests[1].params[1].cp = relative_file; 462179084Srdivacky tests[8].tests[1].params[2].m = 0666 | S_IFCHR; 463179084Srdivacky tests[8].tests[1].params[3].d = 15; 464179084Srdivacky tests[8].tests[2].result = 0; 465179084Srdivacky tests[8].tests[2].params[0].i = rel_fd; 466179084Srdivacky tests[8].tests[2].params[1].cp = nod; 467179084Srdivacky tests[8].tests[2].params[2].m = 0666 | S_IFCHR; 468179084Srdivacky tests[8].tests[2].params[3].d = 2570; 469179084Srdivacky 470179084Srdivacky /* openat */ 471179084Srdivacky tests[9].syscall = SYS_openat; 472179084Srdivacky tests[9].num_of_cases = 5; 473179084Srdivacky tests[9].name = "openat"; 474179084Srdivacky tests[9].tests[0].result = EBADF; 475179084Srdivacky tests[9].tests[0].params[0].i = 106; /* invalid fd */ 476179084Srdivacky tests[9].tests[0].params[1].cp = relative_file; 477179084Srdivacky tests[9].tests[0].params[2].i = O_RDONLY; 478179084Srdivacky tests[9].tests[0].params[3].i = 0666; 479179084Srdivacky tests[9].tests[1].result = ENOTDIR; 480179084Srdivacky tests[9].tests[1].params[0].i = notd_fd; 481179084Srdivacky tests[9].tests[1].params[1].cp = relative_file; 482179084Srdivacky tests[9].tests[1].params[2].i = O_RDONLY; 483179084Srdivacky tests[9].tests[1].params[3].i = 0666; 484179084Srdivacky tests[9].tests[2].result = 8; /* hardcoded fd */ 485179084Srdivacky tests[9].tests[2].params[0].i = rel_fd; 486179084Srdivacky tests[9].tests[2].params[1].cp = file; 487179084Srdivacky tests[9].tests[2].params[2].i = O_RDONLY; 488179084Srdivacky tests[9].tests[2].params[3].i = 0400; 489179084Srdivacky tests[9].tests[3].result = 9; /* hardcoded fd */ 490179084Srdivacky tests[9].tests[3].params[0].i = notd_fd; 491179084Srdivacky tests[9].tests[3].params[1].cp = absolute_file; 492179084Srdivacky tests[9].tests[3].params[2].i = O_RDONLY; 493179084Srdivacky tests[9].tests[3].params[3].i = 0400; 494179084Srdivacky tests[9].tests[4].result = 10; /* hardcoded fd */ 495179084Srdivacky tests[9].tests[4].params[0].i = rel_fd; 496179084Srdivacky tests[9].tests[4].params[1].cp = newfile; 497179084Srdivacky tests[9].tests[4].params[2].i = O_RDONLY | O_CREAT; 498179084Srdivacky tests[9].tests[4].params[3].i = 0666; 499179084Srdivacky 500179084Srdivacky /* readlinkat */ 501179084Srdivacky tests[10].syscall = SYS_readlinkat; 502179084Srdivacky tests[10].num_of_cases = 3; 503179084Srdivacky tests[10].name = "readlinkat"; 504179084Srdivacky tests[10].tests[0].result = EBADF; 505179084Srdivacky tests[10].tests[0].params[0].i = 106; /* invalid fd */ 506179084Srdivacky tests[10].tests[0].params[1].cp = relative_file; 507179084Srdivacky tests[10].tests[0].params[2].vp = cbuf; 508179084Srdivacky tests[10].tests[0].params[3].i = PATH_MAX; 509179084Srdivacky tests[10].tests[1].result = ENOTDIR; 510179084Srdivacky tests[10].tests[1].params[0].i = notd_fd; 511179084Srdivacky tests[10].tests[1].params[1].cp = relative_file; 512179084Srdivacky tests[10].tests[1].params[2].vp = cbuf; 513179084Srdivacky tests[10].tests[1].params[3].i = PATH_MAX; 514179084Srdivacky tests[10].tests[2].result = strlen(absolute_file); 515179084Srdivacky tests[10].tests[2].params[0].i = AT_FDCWD; 516179084Srdivacky tests[10].tests[2].params[1].cp = symlinkf; 517179084Srdivacky tests[10].tests[2].params[2].vp = cbuf; 518179084Srdivacky tests[10].tests[2].params[3].i = PATH_MAX; 519179084Srdivacky 520179084Srdivacky /* renameat */ 521179084Srdivacky tests[11].syscall = SYS_renameat; 522179084Srdivacky tests[11].num_of_cases = 5; 523179084Srdivacky tests[11].name = "renameat"; 524179084Srdivacky tests[11].tests[0].result = EBADF; 525179084Srdivacky tests[11].tests[0].params[0].i = 106; /* invalid fd */ 526179084Srdivacky tests[11].tests[0].params[1].cp = file; 527179084Srdivacky tests[11].tests[0].params[2].i = rel_fd; 528179084Srdivacky tests[11].tests[0].params[3].cp = file; 529179084Srdivacky tests[11].tests[1].result = EBADF; 530179084Srdivacky tests[11].tests[1].params[0].i = rel_fd; 531179084Srdivacky tests[11].tests[1].params[1].cp = file; 532179084Srdivacky tests[11].tests[1].params[2].i = 106; /* invalid fd */ 533179084Srdivacky tests[11].tests[1].params[3].cp = file; 534179084Srdivacky tests[11].tests[2].result = ENOTDIR; 535179084Srdivacky tests[11].tests[2].params[0].i = notd_fd; 536179084Srdivacky tests[11].tests[2].params[1].cp = relative_file; 537179084Srdivacky tests[11].tests[2].params[2].i = rel_fd; 538179084Srdivacky tests[11].tests[2].params[3].cp = file; 539179084Srdivacky tests[11].tests[3].result = ENOTDIR; 540179084Srdivacky tests[11].tests[3].params[0].i = rel_fd; 541179084Srdivacky tests[11].tests[3].params[1].cp = file; 542179084Srdivacky tests[11].tests[3].params[2].i = notd_fd; 543179084Srdivacky tests[11].tests[3].params[3].cp = relative_file; 544179084Srdivacky tests[11].tests[4].result = 0; 545179084Srdivacky tests[11].tests[4].params[0].i = rel_fd; 546179084Srdivacky tests[11].tests[4].params[1].cp = newfile; 547179084Srdivacky tests[11].tests[4].params[2].i = AT_FDCWD; 548179084Srdivacky tests[11].tests[4].params[3].cp = newfile; 549179084Srdivacky 550179084Srdivacky /* symlinkat */ 551179084Srdivacky tests[12].syscall = SYS_symlinkat; 552179084Srdivacky tests[12].num_of_cases = 3; 553179084Srdivacky tests[12].name = "symlinkat"; 554179084Srdivacky tests[12].tests[0].result = EBADF; 555179084Srdivacky tests[12].tests[0].params[0].cp = file; 556179084Srdivacky tests[12].tests[0].params[1].i = 106; /* invalid fd */ 557179084Srdivacky tests[12].tests[0].params[2].cp = file; 558179084Srdivacky tests[12].tests[1].result = ENOTDIR; 559179084Srdivacky tests[12].tests[1].params[0].cp = file; 560179084Srdivacky tests[12].tests[1].params[1].i = notd_fd; 561179084Srdivacky tests[12].tests[1].params[2].cp = relative_file; 562179084Srdivacky tests[12].tests[2].result = 0; 563179084Srdivacky tests[12].tests[2].params[0].cp = absolute_file; 564179084Srdivacky tests[12].tests[2].params[1].i = rel_fd; 565179084Srdivacky tests[12].tests[2].params[2].cp = newslink; 566179084Srdivacky 567179084Srdivacky 568179084Srdivacky /* unlinkat */ 569179084Srdivacky tests[13].syscall = SYS_unlinkat; 570179084Srdivacky tests[13].num_of_cases = 7; 571179084Srdivacky tests[13].name = "unlinkat"; 572179084Srdivacky tests[13].tests[0].result = EBADF; 573179084Srdivacky tests[13].tests[0].params[0].i = 106; /* invalid fd */ 574179084Srdivacky tests[13].tests[0].params[1].cp = relative_file; 575179084Srdivacky tests[13].tests[0].params[2].i = 0; 576179084Srdivacky tests[13].tests[1].result = ENOTDIR; 577179084Srdivacky tests[13].tests[1].params[0].i = notd_fd; 578179084Srdivacky tests[13].tests[1].params[1].cp = relative_file; 579179084Srdivacky tests[13].tests[1].params[2].i = 0; 580179084Srdivacky tests[13].tests[2].result = EINVAL; 581179084Srdivacky tests[13].tests[2].params[0].i = rel_fd; 582179084Srdivacky tests[13].tests[2].params[1].cp = file; 583179084Srdivacky tests[13].tests[2].params[2].i = 123; /* invalid flag */ 584179084Srdivacky tests[13].tests[3].result = ENOTDIR; 585179084Srdivacky tests[13].tests[3].params[0].i = rel_fd; 586179084Srdivacky tests[13].tests[3].params[1].cp = not_dir_path; 587179084Srdivacky tests[13].tests[3].params[2].i = AT_REMOVEDIR; 588179084Srdivacky tests[13].tests[4].result = ENOTEMPTY; 589179084Srdivacky tests[13].tests[4].params[0].i = AT_FDCWD; 590179084Srdivacky tests[13].tests[4].params[1].cp = relative_path; 591179084Srdivacky tests[13].tests[4].params[2].i = AT_REMOVEDIR; 592179084Srdivacky tests[13].tests[5].result = 0; 593179084Srdivacky tests[13].tests[5].params[0].i = rel_fd; 594179084Srdivacky tests[13].tests[5].params[1].cp = newdir; 595179084Srdivacky tests[13].tests[5].params[2].i = AT_REMOVEDIR; 596179084Srdivacky tests[13].tests[6].result = 0; 597179084Srdivacky tests[13].tests[6].params[0].i = AT_FDCWD; 598179084Srdivacky tests[13].tests[6].params[1].cp = newfile; 599179084Srdivacky tests[13].tests[6].params[2].i = 0; 600179084Srdivacky 601179084Srdivacky 602179084Srdivacky /* fexecve */ 603179084Srdivacky tests[14].syscall = SYS_fexecve; 604179084Srdivacky tests[14].num_of_cases = 2; 605179084Srdivacky tests[14].name = "fexecve"; 606179084Srdivacky tests[14].tests[0].result = EBADF; 607179084Srdivacky tests[14].tests[0].params[0].i = 106; /* invalid fd */ 608179084Srdivacky tests[14].tests[0].params[1].cpp = pargv; 609179084Srdivacky tests[14].tests[0].params[2].cpp = NULL; 610179084Srdivacky /* This is EXPECTED to execve /bin/date, so dont expect OK output */ 611179084Srdivacky tests[14].tests[1].result = 0; 612179084Srdivacky tests[14].tests[1].params[0].i = exec_fd; 613179084Srdivacky tests[14].tests[1].params[1].cpp = pargv; 614179084Srdivacky tests[14].tests[1].params[2].cpp = NULL; 615179084Srdivacky} 616179084Srdivacky 617179084Srdivackyvoid 618219568Sbruceccleanup(void) 619179084Srdivacky{ 620179084Srdivacky system("/bin/sh -c 'rm -rf tmp'"); 621179084Srdivacky} 622179084Srdivacky 623179084Srdivackyvoid 624219568Sbrucecsetup_once(void) 625179084Srdivacky{ 626179084Srdivacky} 627179084Srdivacky 628179084Srdivackyint 629179084Srdivackymain(int argc, char *argv[]) 630179084Srdivacky{ 631179084Srdivacky int i,j; 632179084Srdivacky int error; 633179084Srdivacky 634219568Sbrucec (void)argc; 635219568Sbrucec (void)argv; 636219568Sbrucec 637179084Srdivacky setup(); 638179084Srdivacky 639179084Srdivacky for (i = 0; i < NUM_OF_TESTS; i++) { 640219568Sbrucec printf("\nTest: %s\n", tests[i].name); 641179084Srdivacky for (j = 0; j < tests[i].num_of_cases; j++) { 642179084Srdivacky error = syscall(tests[i].syscall, 643179084Srdivacky tests[i].tests[j].params[0], 644179084Srdivacky tests[i].tests[j].params[1], 645179084Srdivacky tests[i].tests[j].params[2], 646179084Srdivacky tests[i].tests[j].params[3], 647179084Srdivacky tests[i].tests[j].params[4]); 648179084Srdivacky if (error == 0) { 649179084Srdivacky if (tests[i].tests[j].result == 0) 650179084Srdivacky printf("#%i ... OK\n", j); 651179084Srdivacky else { 652179084Srdivacky printf("#%i ... BAD: ", j); 653179084Srdivacky printf("expected %i, but got %i\n", tests[i].tests[j].result, error); 654179084Srdivacky } 655179084Srdivacky } else { 656179084Srdivacky if (tests[i].tests[j].result == errno) 657179084Srdivacky printf("#%i ... OK\n", j); 658179084Srdivacky else { 659179084Srdivacky if (error != tests[i].tests[j].result) { 660179084Srdivacky printf("#%i ... BAD: ", j); 661179084Srdivacky printf("expected %i, but got %i\n", tests[i].tests[j].result, error); 662179084Srdivacky } else 663179084Srdivacky printf("#%i ... OK\n", j); 664179084Srdivacky } 665179084Srdivacky } 666179084Srdivacky } 667179084Srdivacky } 668179084Srdivacky 669179084Srdivacky cleanup(); 670179084Srdivacky 671179084Srdivacky return (0); 672179084Srdivacky} 673