]> granicus.if.org Git - strace/commitdiff
net.c: fix printing AF_UNIX abstract socket addresses
authorDmitry V. Levin <ldv@altlinux.org>
Fri, 24 Jun 2016 00:07:44 +0000 (00:07 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 24 Jun 2016 15:48:52 +0000 (15:48 +0000)
AF_UNIX abstract socket address specified by sockaddr_un.sun_path
is not a NUL-terminated string.

* net.c (SIZEOF_SA_FAMILY): New macro.
(print_sockaddr_data_un): Use it.  Specify actual address length
in print_quoted_string calls.  Do not set QUOTE_0_TERMINATED flag
when printing an abstract socket address.

net.c

diff --git a/net.c b/net.c
index a5d9ee44ab17807b8dad60990c81e9cf01809ca1..fe8220a4086ffa7a61ac8a06c506d5e6d30b7b41 100644 (file)
--- a/net.c
+++ b/net.c
 
 #include "xlat/af_packet_types.h"
 
+#define SIZEOF_SA_FAMILY sizeof(((struct sockaddr *) 0)->sa_family)
+
 static void
 print_sockaddr_data_un(const void *const buf, const int addrlen)
 {
        const struct sockaddr_un *const sa_un = buf;
+       const int un_len = addrlen > (int) sizeof(*sa_un)
+                          ? (int) sizeof(*sa_un) : addrlen;
+       const int path_len = un_len - SIZEOF_SA_FAMILY;
 
        tprints("sun_path=");
        if (sa_un->sun_path[0]) {
-               print_quoted_string(sa_un->sun_path,
-                                   sizeof(sa_un->sun_path) + 1,
+               print_quoted_string(sa_un->sun_path, path_len + 1,
                                    QUOTE_0_TERMINATED);
        } else {
                tprints("@");
-               print_quoted_string(sa_un->sun_path + 1,
-                                   sizeof(sa_un->sun_path),
-                                   QUOTE_0_TERMINATED);
+               print_quoted_string(sa_un->sun_path + 1, path_len - 1, 0);
        }
 }