]> granicus.if.org Git - strace/commitdiff
execve: fix support of personalities with different word size
authorDmitry V. Levin <ldv@altlinux.org>
Mon, 27 Jul 2015 10:02:33 +0000 (10:02 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Mon, 27 Jul 2015 15:27:43 +0000 (15:27 +0000)
* execve.c (printargc): Do not assume that host and target pointers have
the same size.
* tests/execve.c: New file.
* tests/execve.expected: Likewise.
* tests/execve-v.expected: Likewise.
* tests/execve.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add execve.
(TESTS): Add execve.test.
(EXTRA_DIST): Add execve.expected and execve-v.expected.
* tests/.gitignore: Add execve.

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

index 2e819cf76db11089cda85607fcf8c084fd5ecc73..3f49e20fe3c972792f8970a50021fd4f08e8fe45 100644 (file)
--- a/execve.c
+++ b/execve.c
@@ -32,10 +32,10 @@ static void
 printargc(const char *fmt, struct tcb *tcp, long addr)
 {
        int count;
-       char *cp;
+       char *cp = NULL;
 
-       for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
-               addr += sizeof(char *);
+       for (count = 0; !umoven(tcp, addr, current_wordsize, &cp) && cp; count++) {
+               addr += current_wordsize;
        }
        tprintf(fmt, count, count == 1 ? "" : "s");
 }
index 98f6e8a2892c61d39c7f8013ab3fc4571e1d4169..495a7375c6bd7145b70153b7a744e8b6a60f8eb2 100644 (file)
@@ -1,5 +1,6 @@
 bpf
 caps
+execve
 fanotify_mark
 filter-unavailable
 getrandom
index e25b1b2a19bbdff08e0b5da2facab77f6c1a1edb..3da24bf452f8bd305dbc1c984e17b377ec4652a1 100644 (file)
@@ -11,6 +11,7 @@ AM_CPPFLAGS = -I$(top_builddir)/$(OS)/$(ARCH) \
 check_PROGRAMS = \
        bpf \
        caps \
+       execve \
        fanotify_mark \
        filter-unavailable \
        getrandom \
@@ -65,6 +66,7 @@ TESTS = \
        bpf.test \
        caps.test \
        dumpio.test \
+       execve.test \
        fanotify_mark.test \
        filter-unavailable.test \
        getdents.test \
@@ -117,6 +119,8 @@ AM_TEST_LOG_FLAGS = STRACE_ARCH=$(ARCH) $(srcdir)/run.sh
 EXTRA_DIST = init.sh run.sh match.awk \
             caps.awk \
             dumpio.expected \
+            execve.expected \
+            execve-v.expected \
             fanotify_mark.expected \
             filter-unavailable.expected \
             getdents.awk \
diff --git a/tests/execve-v.expected b/tests/execve-v.expected
new file mode 100644 (file)
index 0000000..14fafb3
--- /dev/null
@@ -0,0 +1 @@
+execve\("execve\\nfilename", \["execve\\nfilename", "first", "second"\], \["foobar=1", "foo\\nbar=2"\]\) += -1 ENOENT .*
diff --git a/tests/execve.c b/tests/execve.c
new file mode 100644 (file)
index 0000000..69f6f5f
--- /dev/null
@@ -0,0 +1,14 @@
+#include <unistd.h>
+
+#define FILENAME "execve\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)
+{
+       execve(FILENAME, (char * const *) argv, (char * const *) envp);
+       return 0;
+}
diff --git a/tests/execve.expected b/tests/execve.expected
new file mode 100644 (file)
index 0000000..e184d23
--- /dev/null
@@ -0,0 +1 @@
+execve\("execve\\nfilename", \["execve\\nfilename", "first", "second"\], \[/\* 2 vars \*/\]\) += -1 ENOENT .*
diff --git a/tests/execve.test b/tests/execve.test
new file mode 100755 (executable)
index 0000000..a1737cc
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# Check execve 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