While very similar to send()/recv(), the format used by sendto()/recvfrom() is slightly different: the 'addrlen' is not a plain sockaddr_t but a pointer to it.
Split the current function to handle both formats. Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org> Tested-By: Guido Günther <a...@sigxcpu.org> --- linux-user/strace.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/linux-user/strace.c b/linux-user/strace.c index 1bacf75213..5a52d98f3b 100644 --- a/linux-user/strace.c +++ b/linux-user/strace.c @@ -68,6 +68,7 @@ UNUSED static void print_timezone(abi_ulong, int); UNUSED static void print_number(abi_long, int); UNUSED static void print_signal(abi_ulong, int); UNUSED static void print_sockaddr(abi_ulong addr, abi_long addrlen, int); +UNUSED static void print_sockaddr_ptr(abi_ulong addr, abi_long addrlen_ptr, int); UNUSED static void print_socket_domain(int domain); UNUSED static void print_socket_type(int type); UNUSED static void print_socket_protocol(int domain, int type, int protocol); @@ -336,7 +337,8 @@ static void print_siginfo(const target_siginfo_t *tinfo) } static void -print_sockaddr(abi_ulong addr, abi_long addrlen, int last) +print_sockaddr_ex(abi_ulong addr, abi_long addrlen, + bool addrlen_is_ptr, int last) { struct target_sockaddr *sa; int i; @@ -418,7 +420,29 @@ print_sockaddr(abi_ulong addr, abi_long addrlen, int last) } else { print_raw_param("0x"TARGET_ABI_FMT_lx, addr, 0); } - gemu_log(", "TARGET_ABI_FMT_ld"%s", addrlen, get_comma(last)); + gemu_log(", %s"TARGET_ABI_FMT_ld"%s%s", + (addrlen_is_ptr ? "[" : ""), addrlen, + (addrlen_is_ptr ? "]" : ""), get_comma(last)); +} + +static void +print_sockaddr(abi_ulong addr, abi_long addrlen, int last) +{ + print_sockaddr_ex(addr, addrlen, false, last); +} + +static void +print_sockaddr_ptr(abi_ulong addr, abi_long addrlen_ptr, int last) +{ + abi_ulong addrlen; + + if (!addr) { + print_sockaddr_ex(0, 0, false, last); + return; + } + + get_user_ual(addrlen, addrlen_ptr); + print_sockaddr_ex(addr, addrlen, true, last); } static void -- 2.18.0