diff --git a/mem.c b/mem.c index 2ca89548..1f37826f 100644 --- a/mem.c +++ b/mem.c @@ -96,15 +96,15 @@ SYS_FUNC(old_mmap) long u_arg[6]; # if defined AARCH64 || defined X86_64 /* We are here only in a 32-bit personality. */ - int i; - unsigned narrow_arg[6]; - if (umoven(tcp, tcp->u_arg[0], sizeof(narrow_arg), narrow_arg) == -1) - return 0; - for (i = 0; i < 6; ++i) - u_arg[i] = (unsigned long) narrow_arg[i]; + unsigned int narrow_arg[6]; + if (umove_or_printaddr(tcp, tcp->u_arg[0], &narrow_arg)) + return RVAL_DECODED | RVAL_HEX; + unsigned int i; + for (i = 0; i < 6; i++) + u_arg[i] = narrow_arg[i]; # else - if (umoven(tcp, tcp->u_arg[0], sizeof(u_arg), u_arg) == -1) - return 0; + if (umove_or_printaddr(tcp, tcp->u_arg[0], &u_arg)) + return RVAL_DECODED | RVAL_HEX; # endif print_mmap(tcp, u_arg, (unsigned long) u_arg[5]); diff --git a/tests/old_mmap.c b/tests/old_mmap.c index c9e802de..97051db9 100644 --- a/tests/old_mmap.c +++ b/tests/old_mmap.c @@ -51,6 +51,9 @@ int main(void) { + long rc = syscall(__NR_mmap, 0); + printf("mmap(NULL) = %ld %s (%m)\n", rc, errno2name()); + const unsigned int args1_c[6] = { 0xdeadbeef, /* addr */ 0xfacefeed, /* len */ @@ -70,7 +73,7 @@ main(void) }; void *args = tail_memdup(args1_c, sizeof(args1_c)); - long rc = syscall(__NR_mmap, args); + rc = syscall(__NR_mmap, args); printf("mmap(%#x, %u, PROT_READ|PROT_EXEC, MAP_FILE|MAP_FIXED" ", %d, %#x) = %ld %s (%m)\n", args1_c[0], args1_c[1], args1_c[4], args1_c[5], diff --git a/tests/old_mmap.test b/tests/old_mmap.test index 07fb44a2..af776ff7 100755 --- a/tests/old_mmap.test +++ b/tests/old_mmap.test @@ -3,4 +3,4 @@ # Check decoding of "old mmap" edition of mmap syscall. . "${srcdir=.}/init.sh" -run_strace_match_diff -e trace=mmap +run_strace_match_diff -a11 -e trace=mmap