summaryrefslogtreecommitdiff
path: root/ctdb/common/ctdb_util.c
diff options
context:
space:
mode:
authorMartin Schwenke <martin@meltin.net>2017-10-18 20:08:19 +1100
committerAmitay Isaacs <amitay@samba.org>2017-11-07 03:53:27 +0100
commit28d6356a65eac558d095af53c5d396f884a3b59f (patch)
tree17394b8444e321c69f3c93976c90fc843be92db5 /ctdb/common/ctdb_util.c
parent44c018bdcc2d81aaf667d11c0c8fae209419ddd7 (diff)
downloadsamba-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.c44
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;
}
}