diff mbox series

[v3,11/13] linux-user/strace: Add print_sockaddr_ptr() to handle plain/pointer addrlen

Message ID 20180702175030.18621-12-f4bug@amsat.org
State New
Headers show
Series linux-user: strace improvements | expand

Commit Message

Philippe Mathieu-Daudé July 2, 2018, 5:50 p.m. UTC
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é <f4bug@amsat.org>
Tested-By: Guido Günther <agx@sigxcpu.org>
---
 linux-user/strace.c | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

Comments

Laurent Vivier July 2, 2018, 6:52 p.m. UTC | #1
Le 02/07/2018 à 19:50, Philippe Mathieu-Daudé a écrit :
> 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é <f4bug@amsat.org>
> Tested-By: Guido Günther <agx@sigxcpu.org>
> ---
>  linux-user/strace.c | 28 ++++++++++++++++++++++++++--
>  1 file changed, 26 insertions(+), 2 deletions(-)
> 

In the following patches I think you can use do_print_sockaddr() and
don't have to define print_sockaddr_ptr()

Thanks,
Laurent
diff mbox series

Patch

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