diff options
author | Martin Schwenke <martin@meltin.net> | 2017-10-18 20:08:19 +1100 |
---|---|---|
committer | Amitay Isaacs <amitay@samba.org> | 2017-11-07 03:53:27 +0100 |
commit | 28d6356a65eac558d095af53c5d396f884a3b59f (patch) | |
tree | 17394b8444e321c69f3c93976c90fc843be92db5 /ctdb/common/ctdb_util.c | |
parent | 44c018bdcc2d81aaf667d11c0c8fae209419ddd7 (diff) | |
download | samba-28d6356a65eac558d095af53c5d396f884a3b59f.tar.gz |
ctdb-common: Ensure unused bytes in union are initialised
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
Diffstat (limited to 'ctdb/common/ctdb_util.c')
-rw-r--r-- | ctdb/common/ctdb_util.c | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/ctdb/common/ctdb_util.c b/ctdb/common/ctdb_util.c index 901e5e2a630..82526b58a19 100644 --- a/ctdb/common/ctdb_util.c +++ b/ctdb/common/ctdb_util.c @@ -373,19 +373,45 @@ struct ctdb_rec_data_old *ctdb_marshall_loop_next( */ void ctdb_canonicalize_ip(const ctdb_sock_addr *ip, ctdb_sock_addr *cip) { - char prefix[12] = { 0,0,0,0,0,0,0,0,0,0,0xff,0xff }; + ZERO_STRUCTP(cip); - memcpy(cip, ip, sizeof (*cip)); - - if ( (ip->sa.sa_family == AF_INET6) - && !memcmp(&ip->ip6.sin6_addr, prefix, 12)) { - memset(cip, 0, sizeof(*cip)); + if (ip->sa.sa_family == AF_INET6) { + const char prefix[12] = { 0,0,0,0,0,0,0,0,0,0,0xff,0xff }; + if (memcmp(&ip->ip6.sin6_addr, prefix, sizeof(prefix)) == 0) { + /* Copy IPv4-mapped IPv6 addresses as IPv4 */ + cip->ip.sin_family = AF_INET; +#ifdef HAVE_SOCK_SIN_LEN + cip->ip.sin_len = sizeof(ctdb_sock_addr); +#endif + cip->ip.sin_port = ip->ip6.sin6_port; + memcpy(&cip->ip.sin_addr, + &ip->ip6.sin6_addr.s6_addr[12], + sizeof(cip->ip.sin_addr)); + } else { + cip->ip6.sin6_family = AF_INET6; #ifdef HAVE_SOCK_SIN_LEN - cip->ip.sin_len = sizeof(*cip); + cip->ip6.sin_len = sizeof(ctdb_sock_addr); #endif + cip->ip6.sin6_port = ip->ip6.sin6_port; + memcpy(&cip->ip6.sin6_addr, + &ip->ip6.sin6_addr, + sizeof(cip->ip6.sin6_addr)); + } + + return; + } + + if (ip->sa.sa_family == AF_INET) { cip->ip.sin_family = AF_INET; - cip->ip.sin_port = ip->ip6.sin6_port; - memcpy(&cip->ip.sin_addr, &ip->ip6.sin6_addr.s6_addr[12], 4); +#ifdef HAVE_SOCK_SIN_LEN + cip->ip.sin_len = sizeof(ctdb_sock_addr); +#endif + cip->ip.sin_port = ip->ip.sin_port; + memcpy(&cip->ip.sin_addr, + &ip->ip.sin_addr, + sizeof(ip->ip.sin_addr)); + + return; } } |