From 4ff687bb31ee2caa8b0ce54911bc61708889e272 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Mon, 27 Jul 2015 10:02:33 +0000 Subject: [PATCH] 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. --- execve.c | 6 +++--- tests/.gitignore | 1 + tests/Makefile.am | 4 ++++ tests/execve-v.expected | 1 + tests/execve.c | 14 ++++++++++++++ tests/execve.expected | 1 + tests/execve.test | 13 +++++++++++++ 7 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 tests/execve-v.expected create mode 100644 tests/execve.c create mode 100644 tests/execve.expected create mode 100755 tests/execve.test diff --git a/execve.c b/execve.c index 2e819cf7..3f49e20f 100644 --- 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"); } diff --git a/tests/.gitignore b/tests/.gitignore index 98f6e8a2..495a7375 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 e25b1b2a..3da24bf4 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 00000000..14fafb31 --- /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 00000000..69f6f5fe --- /dev/null +++ b/tests/execve.c @@ -0,0 +1,14 @@ +#include + +#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 00000000..e184d235 --- /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 00000000..a1737cc9 --- /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 -- 2.40.0