rxrpc: Clear the unused part of a sockaddr_rxrpc for memcmp() use
authorDavid Howells <dhowells@redhat.com>
Fri, 4 Mar 2016 15:59:49 +0000 (15:59 +0000)
committerDavid Howells <dhowells@redhat.com>
Fri, 4 Mar 2016 15:59:49 +0000 (15:59 +0000)
Clear the unused part of a sockaddr_rxrpc structs so that memcmp() can be
used to compare them.

Signed-off-by: David Howells <dhowells@redhat.com>
net/rxrpc/af_rxrpc.c

index b46f7742d3364650374c428b39f8c3b5f237d5ca..a76501757b59eaf877a3ae6d3a89000c010a6541 100644 (file)
@@ -81,6 +81,8 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,
                                  struct sockaddr_rxrpc *srx,
                                  int len)
 {
+       unsigned tail;
+
        if (len < sizeof(struct sockaddr_rxrpc))
                return -EINVAL;
 
@@ -103,9 +105,7 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,
                _debug("INET: %x @ %pI4",
                       ntohs(srx->transport.sin.sin_port),
                       &srx->transport.sin.sin_addr);
-               if (srx->transport_len > 8)
-                       memset((void *)&srx->transport + 8, 0,
-                              srx->transport_len - 8);
+               tail = offsetof(struct sockaddr_rxrpc, transport.sin.__pad);
                break;
 
        case AF_INET6:
@@ -113,6 +113,8 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,
                return -EAFNOSUPPORT;
        }
 
+       if (tail < len)
+               memset((void *)srx + tail, 0, len - tail);
        return 0;
 }