From 64906b8f0a88bdac7c9e38c96f15543afde7d814 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Wed, 22 Jun 2016 00:21:47 +0000 Subject: [PATCH] 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. --- net.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) 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); -- 2.40.0