]> granicus.if.org Git - strace/commitdiff
Implement execveat syscall decoding
authorDmitry V. Levin <ldv@altlinux.org>
Sun, 26 Jul 2015 11:06:53 +0000 (11:06 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Mon, 27 Jul 2015 15:27:43 +0000 (15:27 +0000)
* execve.c (decode_execve): New function.
(sys_execve): Use it.
(sys_execveat): New function.
* linux/dummy.h (sys_execveat): Remove.
* tests/execveat.c: New file.
* tests/execveat.expected: Likewise.
* tests/execveat-v.expected: Likewise.
* tests/execveat.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add execveat.
(TESTS): Add execveat.test.
(EXTRA_DIST): Add execveat.expected and execveat-v.expected.
* tests/.gitignore: Add execveat.

execve.c
linux/dummy.h
tests/.gitignore
tests/Makefile.am
tests/execveat-v.expected [new file with mode: 0644]
tests/execveat.c [new file with mode: 0644]
tests/execveat.expected [new file with mode: 0644]
tests/execveat.test [new file with mode: 0755]

index 3f49e20fe3c972792f8970a50021fd4f08e8fe45..a8f53f608031ee6d27cf307b87dbf48692e95f4a 100644 (file)
--- a/execve.c
+++ b/execve.c
@@ -40,29 +40,45 @@ printargc(const char *fmt, struct tcb *tcp, long addr)
        tprintf(fmt, count, count == 1 ? "" : "s");
 }
 
-SYS_FUNC(execve)
+static void
+decode_execve(struct tcb *tcp, const unsigned int index)
 {
-       printpath(tcp, tcp->u_arg[0]);
+       printpath(tcp, tcp->u_arg[index + 0]);
        tprints(", ");
 
-       if (!tcp->u_arg[1] || !verbose(tcp))
-               printaddr(tcp->u_arg[1]);
+       if (!tcp->u_arg[index + 1] || !verbose(tcp))
+               printaddr(tcp->u_arg[index + 1]);
        else {
                tprints("[");
-               printargv(tcp, tcp->u_arg[1]);
+               printargv(tcp, tcp->u_arg[index + 1]);
                tprints("]");
        }
        tprints(", ");
 
-       if (!tcp->u_arg[2] || !verbose(tcp))
-               printaddr(tcp->u_arg[2]);
+       if (!tcp->u_arg[index + 2] || !verbose(tcp))
+               printaddr(tcp->u_arg[index + 2]);
        else if (abbrev(tcp))
-               printargc("[/* %d var%s */]", tcp, tcp->u_arg[2]);
+               printargc("[/* %d var%s */]", tcp, tcp->u_arg[index + 2]);
        else {
                tprints("[");
-               printargv(tcp, tcp->u_arg[2]);
+               printargv(tcp, tcp->u_arg[index + 2]);
                tprints("]");
        }
+}
+
+SYS_FUNC(execve)
+{
+       decode_execve(tcp, 0);
+
+       return RVAL_DECODED;
+}
+
+SYS_FUNC(execveat)
+{
+       print_dirfd(tcp, tcp->u_arg[0]);
+       decode_execve(tcp, 1);
+       tprints(", ");
+       printflags(at_flags, tcp->u_arg[4], "AT_???");
 
        return RVAL_DECODED;
 }
index 0a3db913bb7342395a4286c475ab101d12bd75a8..4e9db9e50318828d56af0f5b6ba67a52097709de 100644 (file)
@@ -32,7 +32,6 @@
 #endif
 
 /* still unfinished */
-#define        sys_execveat            printargs
 #define        sys_ioperm              printargs
 #define        sys_iopl                printargs
 #define        sys_kcmp                printargs
index 495a7375c6bd7145b70153b7a744e8b6a60f8eb2..3ea70db1c409954be442b240562f45d9f96d9c8a 100644 (file)
@@ -1,6 +1,7 @@
 bpf
 caps
 execve
+execveat
 fanotify_mark
 filter-unavailable
 getrandom
index 3da24bf452f8bd305dbc1c984e17b377ec4652a1..bd3f5cfc86dab8cd8bfa5a53d83911bcce0b1fa4 100644 (file)
@@ -12,6 +12,7 @@ check_PROGRAMS = \
        bpf \
        caps \
        execve \
+       execveat \
        fanotify_mark \
        filter-unavailable \
        getrandom \
@@ -67,6 +68,7 @@ TESTS = \
        caps.test \
        dumpio.test \
        execve.test \
+       execveat.test \
        fanotify_mark.test \
        filter-unavailable.test \
        getdents.test \
@@ -121,6 +123,8 @@ EXTRA_DIST = init.sh run.sh match.awk \
             dumpio.expected \
             execve.expected \
             execve-v.expected \
+            execveat.expected \
+            execveat-v.expected \
             fanotify_mark.expected \
             filter-unavailable.expected \
             getdents.awk \
diff --git a/tests/execveat-v.expected b/tests/execveat-v.expected
new file mode 100644 (file)
index 0000000..ebac879
--- /dev/null
@@ -0,0 +1 @@
+execveat\(AT_FDCWD, "execveat\\nfilename", \["execveat\\nfilename", "first", "second"\], \["foobar=1", "foo\\nbar=2"\], AT_SYMLINK_NOFOLLOW\|AT_EMPTY_PATH\) += -1 .*
diff --git a/tests/execveat.c b/tests/execveat.c
new file mode 100644 (file)
index 0000000..4363c94
--- /dev/null
@@ -0,0 +1,31 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <unistd.h>
+#include <sys/syscall.h>
+
+#ifdef __NR_execveat
+
+#define FILENAME "execveat\nfilename"
+static const char * const argv[] =
+       { FILENAME, "first", "second", NULL, NULL, NULL };
+static const char * const envp[] =
+       { "foobar=1", "foo\nbar=2", NULL , "", NULL , "", NULL, NULL};
+
+int
+main(void)
+{
+       syscall(__NR_execveat, -100, FILENAME, argv, envp, 0x1100);
+       return 0;
+}
+
+#else
+
+int
+main(void)
+{
+       return 77;
+}
+
+#endif
diff --git a/tests/execveat.expected b/tests/execveat.expected
new file mode 100644 (file)
index 0000000..7383ed2
--- /dev/null
@@ -0,0 +1 @@
+execveat\(AT_FDCWD, "execveat\\nfilename", \["execveat\\nfilename", "first", "second"\], \[/\* 2 vars \*/\], AT_SYMLINK_NOFOLLOW\|AT_EMPTY_PATH\) += -1 .*
diff --git a/tests/execveat.test b/tests/execveat.test
new file mode 100755 (executable)
index 0000000..b371b07
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# Check execveat syscall decoding.
+
+. "${srcdir=.}/init.sh"
+
+run_prog
+run_strace $args
+match_grep
+run_strace -v $args
+match_grep "$LOG" "$srcdir/${ME_%.test}-v.expected"
+
+exit 0