s3:ctdbd_conn: fix ctdbd_public_ip_foreach() for ipv6 addresses
authorStefan Metzmacher <metze@samba.org>
Tue, 15 Aug 2023 06:57:57 +0000 (08:57 +0200)
committerJule Anger <janger@samba.org>
Thu, 28 Dec 2023 17:15:55 +0000 (17:15 +0000)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15534

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
Autobuild-User(master): Stefan Metzmacher <metze@samba.org>
Autobuild-Date(master): Thu Dec 21 11:09:30 UTC 2023 on atb-devel-224

(cherry picked from commit 828f3c99122fb033ecb79e24ed24821b8510f0f8)

Autobuild-User(v4-19-test): Jule Anger <janger@samba.org>
Autobuild-Date(v4-19-test): Thu Dec 28 17:15:55 UTC 2023 on atb-devel-224

source3/lib/ctdbd_conn.c

index a739c97f3fd260e6bba4f3a7840da5870a57727e..3698c9d3672473e9f2719f0e4c9a3b7b1130d67f 100644 (file)
@@ -1438,6 +1438,32 @@ static int ctdbd_control_get_public_ips(struct ctdbd_connection *conn,
        return 0;
 }
 
+static struct samba_sockaddr ctdbd_sock_addr_to_samba(const ctdb_sock_addr *c)
+{
+       struct samba_sockaddr s = {};
+
+       switch (c->sa.sa_family) {
+       case AF_INET:
+               s.u.in = c->ip;
+               break;
+       case AF_INET6:
+               /*
+                * ctdb always requires HAVE_IPV6,
+                * so we don't need an ifdef here.
+                */
+               s.u.in6 = c->ip6;
+               break;
+       default:
+               /*
+                * ctdb_sock_addr only supports ipv4 and ipv6
+                */
+               smb_panic(__location__);
+               break;
+       }
+
+       return s;
+}
+
 int ctdbd_public_ip_foreach(struct ctdbd_connection *conn,
                            int (*cb)(uint32_t total_ip_count,
                                      const struct sockaddr_storage *ip,
@@ -1457,11 +1483,8 @@ int ctdbd_public_ip_foreach(struct ctdbd_connection *conn,
        }
 
        for (i=0; i < ips->num; i++) {
-               struct samba_sockaddr tmp = {
-                       .u = {
-                               .sa = ips->ips[i].addr.sa,
-                       },
-               };
+               const ctdb_sock_addr *addr = &ips->ips[i].addr;
+               struct samba_sockaddr tmp = ctdbd_sock_addr_to_samba(addr);
 
                ret = cb(ips->num,
                         &tmp.u.ss,