diff options
Diffstat (limited to 'tests/execveat.c')
-rw-r--r-- | tests/execveat.c | 122 |
1 files changed, 114 insertions, 8 deletions
diff --git a/tests/execveat.c b/tests/execveat.c index 43b53edb1..a41c42319 100644 --- a/tests/execveat.c +++ b/tests/execveat.c @@ -13,9 +13,102 @@ #ifdef __NR_execveat +# include <fcntl.h> # include <stdio.h> # include <unistd.h> +# include "secontext.h" + +static void +tests_with_existing_file(void) +{ + /* + * Make sure the current workdir of the tracee + * is different from the current workdir of the tracer. + */ + create_and_enter_subdir("execveat_subdir"); + + char *my_secontext = SECONTEXT_PID_MY(); + + static const char sample[] = "execveat_sample"; + (void) unlink(sample); + if (open(sample, O_RDONLY | O_CREAT, 0400) < 0) + perror_msg_and_fail("open"); + + char *sample_secontext = SECONTEXT_FILE(sample); + static const char *argv[] = { sample, NULL }; + + /* + * Tests with AT_FDCWD. + */ + + long rc = syscall(__NR_execveat, -100, sample, argv, NULL, 0); + printf("%s%s(AT_FDCWD, \"%s\"%s, [\"%s\"], NULL, 0) = %s\n", + my_secontext, "execveat", + sample, sample_secontext, + argv[0], + sprintrc(rc)); + + if (unlink(sample)) + perror_msg_and_fail("unlink"); + + rc = syscall(__NR_execveat, -100, sample, argv, NULL, 0); + printf("%s%s(AT_FDCWD, \"%s\", [\"%s\"], NULL, 0) = %s\n", + my_secontext, "execveat", + sample, + argv[0], + sprintrc(rc)); + + /* + * Tests with dirfd. + */ + + int cwd_fd = get_dir_fd("."); + char *cwd = get_fd_path(cwd_fd); + char *cwd_secontext = SECONTEXT_FILE("."); + char *sample_realpath = xasprintf("%s/%s", cwd, sample); + + /* no file */ + rc = syscall(__NR_execveat, cwd_fd, sample, argv, NULL, 0); + printf("%s%s(%d%s, \"%s\", [\"%s\"], NULL, 0) = %s\n", + my_secontext, "execveat", + cwd_fd, cwd_secontext, + sample, + argv[0], + sprintrc(rc)); + + if (open(sample, O_RDONLY | O_CREAT, 0400) < 0) + perror_msg_and_fail("open"); + + rc = syscall(__NR_execveat, cwd_fd, sample, argv, NULL, 0); + printf("%s%s(%d%s, \"%s\"%s, [\"%s\"], NULL, 0) = %s\n", + my_secontext, "execveat", + cwd_fd, cwd_secontext, + sample, sample_secontext, + argv[0], + sprintrc(rc)); + + /* cwd_fd ignored when path is absolute */ + if (chdir("../..")) + perror_msg_and_fail("chdir"); + + rc = syscall(__NR_execveat, cwd_fd, sample_realpath, argv, NULL, 0); + printf("%s%s(%d%s, \"%s\"%s, [\"%s\"], NULL, 0) = %s\n", + my_secontext, "execveat", + cwd_fd, cwd_secontext, + sample_realpath, sample_secontext, + argv[0], + sprintrc(rc)); + + if (fchdir(cwd_fd)) + perror_msg_and_fail("fchdir"); + + if (unlink(sample)) + perror_msg_and_fail("unlink"); + + leave_and_remove_subdir(); +} + # define FILENAME "test.execveat\nfilename" # define Q_FILENAME "test.execveat\\nfilename" @@ -40,9 +133,10 @@ main(void) { const char ** const tail_argv = tail_memdup(argv, sizeof(argv)); const char ** const tail_envp = tail_memdup(envp, sizeof(envp)); + char *my_secontext = SECONTEXT_PID_MY(); syscall(__NR_execveat, -100, FILENAME, tail_argv, tail_envp, 0x1100); - printf("execveat(AT_FDCWD, \"%s\"" + printf("%s%s(AT_FDCWD, \"%s\"" ", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ... /* %p */]" # if VERBOSE ", [\"%s\", \"%s\", %p, %p, %p, ... /* %p */]" @@ -50,6 +144,7 @@ main(void) ", %p /* 5 vars, unterminated */" # endif ", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n", + my_secontext, "execveat", Q_FILENAME, q_argv[0], q_argv[1], q_argv[2], argv[3], argv[4], argv[5], (char *) tail_argv + sizeof(argv), # if VERBOSE @@ -65,13 +160,14 @@ main(void) (void) q_envp; /* workaround for clang bug #33068 */ syscall(__NR_execveat, -100, FILENAME, tail_argv, tail_envp, 0x1100); - printf("execveat(AT_FDCWD, \"%s\", [\"%s\", \"%s\", \"%s\"]" + printf("%s%s(AT_FDCWD, \"%s\", [\"%s\", \"%s\", \"%s\"]" # if VERBOSE ", [\"%s\", \"%s\"]" # else ", %p /* 2 vars */" # endif ", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n", + my_secontext, "execveat", Q_FILENAME, q_argv[0], q_argv[1], q_argv[2], # if VERBOSE q_envp[0], q_envp[1], @@ -81,13 +177,14 @@ main(void) errno2name()); syscall(__NR_execveat, -100, FILENAME, tail_argv + 2, tail_envp + 1, 0x1100); - printf("execveat(AT_FDCWD, \"%s\", [\"%s\"]" + printf("%s%s(AT_FDCWD, \"%s\", [\"%s\"]" # if VERBOSE ", [\"%s\"]" # else ", %p /* 1 var */" # endif ", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n", + my_secontext, "execveat", Q_FILENAME, q_argv[2], # if VERBOSE q_envp[1], @@ -101,13 +198,14 @@ main(void) *empty = NULL; syscall(__NR_execveat, -100, FILENAME, empty, empty, 0x1100); - printf("execveat(AT_FDCWD, \"%s\", []" + printf("%s%s(AT_FDCWD, \"%s\", []" # if VERBOSE ", []" # else ", %p /* 0 vars */" # endif ", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n", + my_secontext, "execveat", Q_FILENAME, # if !VERBOSE empty, @@ -132,7 +230,9 @@ main(void) a[i] = b[i] = NULL; syscall(__NR_execveat, -100, FILENAME, a, b, 0x1100); - printf("execveat(AT_FDCWD, \"%s\", [\"%.*s\"...", Q_FILENAME, DEFAULT_STRLEN, a[0]); + printf("%s%s(AT_FDCWD, \"%s\", [\"%.*s\"...", + my_secontext, "execveat", + Q_FILENAME, DEFAULT_STRLEN, a[0]); for (i = 1; i < DEFAULT_STRLEN; ++i) printf(", \"%s\"", a[i]); # if VERBOSE @@ -152,7 +252,9 @@ main(void) errno2name()); syscall(__NR_execveat, -100, FILENAME, a + 1, b + 1, 0x1100); - printf("execveat(AT_FDCWD, \"%s\", [\"%s\"", Q_FILENAME, a[1]); + printf("%s%s(AT_FDCWD, \"%s\", [\"%s\"", + my_secontext, "execveat", + Q_FILENAME, a[1]); for (i = 2; i <= DEFAULT_STRLEN; ++i) printf(", \"%s\"", a[i]); # if VERBOSE @@ -167,15 +269,19 @@ main(void) errno2name()); syscall(__NR_execveat, -100, FILENAME, NULL, efault, 0x1100); - printf("execveat(AT_FDCWD, \"%s\", NULL, %p" + printf("%s%s(AT_FDCWD, \"%s\", NULL, %p" ", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n", + my_secontext, "execveat", Q_FILENAME, efault, errno2name()); syscall(__NR_execveat, -100, FILENAME, efault, NULL, 0x1100); - printf("execveat(AT_FDCWD, \"%s\", %p, NULL" + printf("%s%s(AT_FDCWD, \"%s\", %p, NULL" ", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n", + my_secontext, "execveat", Q_FILENAME, efault, errno2name()); + tests_with_existing_file(); + puts("+++ exited with 0 +++"); return 0; } |