execve: fix support of personalities with different word size
* 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.
diff --git a/execve.c b/execve.c
index 2e819cf..3f49e20 100644
--- a/execve.c
+++ b/execve.c
@@ -32,10 +32,10 @@
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");
}
diff --git a/tests/.gitignore b/tests/.gitignore
index 98f6e8a..495a737 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -1,5 +1,6 @@
bpf
caps
+execve
fanotify_mark
filter-unavailable
getrandom
diff --git a/tests/Makefile.am b/tests/Makefile.am
index e25b1b2..3da24bf 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -11,6 +11,7 @@
check_PROGRAMS = \
bpf \
caps \
+ execve \
fanotify_mark \
filter-unavailable \
getrandom \
@@ -65,6 +66,7 @@
bpf.test \
caps.test \
dumpio.test \
+ execve.test \
fanotify_mark.test \
filter-unavailable.test \
getdents.test \
@@ -117,6 +119,8 @@
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
index 0000000..14fafb3
--- /dev/null
+++ b/tests/execve-v.expected
@@ -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
index 0000000..69f6f5f
--- /dev/null
+++ b/tests/execve.c
@@ -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
index 0000000..e184d23
--- /dev/null
+++ b/tests/execve.expected
@@ -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
index 0000000..a1737cc
--- /dev/null
+++ b/tests/execve.test
@@ -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