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