From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60781) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fa2yp-0005GX-FU for qemu-devel@nongnu.org; Mon, 02 Jul 2018 13:51:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fa2yl-0003sa-Hu for qemu-devel@nongnu.org; Mon, 02 Jul 2018 13:51:15 -0400 Received: from mail-vk0-x244.google.com ([2607:f8b0:400c:c05::244]:42873) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fa2yl-0003sC-Dj for qemu-devel@nongnu.org; Mon, 02 Jul 2018 13:51:11 -0400 Received: by mail-vk0-x244.google.com with SMTP id s187-v6so9627915vke.9 for ; Mon, 02 Jul 2018 10:51:11 -0700 (PDT) Sender: =?UTF-8?Q?Philippe_Mathieu=2DDaud=C3=A9?= From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Date: Mon, 2 Jul 2018 14:50:28 -0300 Message-Id: <20180702175030.18621-12-f4bug@amsat.org> In-Reply-To: <20180702175030.18621-1-f4bug@amsat.org> References: <20180702175030.18621-1-f4bug@amsat.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [PATCH v3 11/13] linux-user/strace: Add print_sockaddr_ptr() to handle plain/pointer addrlen List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Laurent Vivier Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org, Riku Voipio , =?UTF-8?q?Guido=20G=C3=BCnther?= 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é Tested-By: Guido Günther --- 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 85a1efef32..9ab11059e4 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