summaryrefslogtreecommitdiff
path: root/tests/execveat.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/execveat.c')
-rw-r--r--tests/execveat.c122
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;
}