From: Dmitry V. Levin Date: Wed, 22 Jun 2016 00:21:47 +0000 (+0000) Subject: printsock: fix zero padding of sockaddr buffer X-Git-Tag: v4.13~112 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=64906b8f0a88bdac7c9e38c96f15543afde7d814;p=strace printsock: fix zero padding of sockaddr buffer Before this change printsock used to erroneously clear the last byte of sockaddr buffer. * net.c (printsock): Use struct sockaddr_storage as a sockaddr buffer. Reserve additional byte after the sockaddr buffer for zero padding. Do not clear memory that is going to be overwritten by umoven. Clear the tail of sockaddr buffer that was not overwritten by umoven. --- diff --git a/net.c b/net.c index 61c7ad9f..51c3961a 100644 --- a/net.c +++ b/net.c @@ -258,20 +258,24 @@ print_sockaddr(struct tcb *tcp, const void *const buf, const int addrlen) int printsock(struct tcb *tcp, long addr, int addrlen) { - sockaddr_buf_t addrbuf; - if (addrlen < 2) { printaddr(addr); return -1; } - if (addrlen > (int) sizeof(addrbuf)) - addrlen = sizeof(addrbuf); + union { + struct sockaddr sa; + struct sockaddr_storage storage; + char pad[sizeof(struct sockaddr_storage) + 1]; + } addrbuf; + + if ((unsigned) addrlen > sizeof(addrbuf.storage)) + addrlen = sizeof(addrbuf.storage); - memset(&addrbuf, 0, sizeof(addrbuf)); if (umoven_or_printaddr(tcp, addr, addrlen, addrbuf.pad)) return -1; - addrbuf.pad[sizeof(addrbuf.pad) - 1] = '\0'; + + memset(&addrbuf.pad[addrlen], 0, sizeof(addrbuf.pad) - addrlen); print_sockaddr(tcp, &addrbuf, addrlen);