]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libsmb: Convert resolve_name() to return struct samba_sockaddr
authorVolker Lendecke <vl@samba.org>
Sat, 13 Jun 2026 12:51:47 +0000 (14:51 +0200)
committerVolker Lendecke <vl@samba.org>
Fri, 3 Jul 2026 08:08:36 +0000 (08:08 +0000)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
14 files changed:
source3/libads/ldap.c
source3/libsmb/libsmb_dir.c
source3/libsmb/namequery.c
source3/libsmb/namequery.h
source3/rpc_client/cli_pipe.c
source3/rpc_server/spoolss/srv_spoolss_nt.c
source3/smbd/smb2_reply.c
source3/torture/torture.c
source3/utils/net_ads.c
source3/utils/net_lookup.c
source3/utils/net_util.c
source3/utils/smbfilter.c
source3/winbindd/idmap_ad.c
source3/winbindd/winbindd_cm.c

index 66853f5661c17c1367a95f867c58907404dde737..43c04b01ba553795631ba96f12a478cf9725790d 100644 (file)
@@ -911,7 +911,7 @@ static ADS_STATUS ads_connect_internal(ADS_STRUCT *ads,
 
        if (ads->server.ldap_server) {
                bool ok = false;
-               struct sockaddr_storage ss;
+               struct samba_sockaddr ss;
 
                DBG_DEBUG("Resolving name of LDAP server '%s'.\n",
                          ads->server.ldap_server);
@@ -923,12 +923,12 @@ static ADS_STATUS ads_connect_internal(ADS_STRUCT *ads,
                        goto out;
                }
 
-               if (is_zero_addr(&ss)) {
+               if (is_zero_addr(&ss.u.ss)) {
                        status = ADS_ERROR_NT(NT_STATUS_NOT_FOUND);
                        goto out;
                }
 
-               ok = ads_try_connect(ads, ads->server.gc, &ss);
+               ok = ads_try_connect(ads, ads->server.gc, &ss.u.ss);
                if (ok) {
                        goto got_connection;
                }
index 2310990a22c0352a717bf44eda1a33e019f5b6e0..90250dd9ee57c20e19c922b67fba033e6640f407 100644 (file)
@@ -466,7 +466,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
        uint16_t port = 0;
        SMBCSRV *srv  = NULL;
        SMBCFILE *dir = NULL;
-       struct sockaddr_storage rem_ss;
+       struct samba_sockaddr rem_ss;
        TALLOC_CTX *frame = talloc_stackframe();
 
        if (!context || !context->internal->initialized) {
@@ -759,10 +759,12 @@ SMBC_opendir_ctx(SMBCCTX *context,
                                 * Get the backup list ...
                                 */
                                if (!name_status_find(wgroup, 0, 0,
-                                                      &rem_ss, buserver)) {
+                                                      &rem_ss.u.ss, buserver)) {
                                        char addr[INET6_ADDRSTRLEN];
 
-                                       print_sockaddr(addr, sizeof(addr), &rem_ss);
+                                       print_sockaddr(addr,
+                                                      sizeof(addr),
+                                                      &rem_ss.u.ss);
                                         DEBUG(0,("Could not get name of "
                                                 "local/domain master browser "
                                                 "for workgroup %s from "
index 8e3b858143874c567caaa277316ce39a48e8e359..a3e70caab6f36ed3c6657a251eaf085540f301bc 100644 (file)
@@ -2976,9 +2976,9 @@ NTSTATUS internal_resolve_name(TALLOC_CTX *ctx,
 *********************************************************/
 
 bool resolve_name(const char *name,
-               struct sockaddr_storage *return_ss,
-               int name_type,
-               bool prefer_ipv4)
+                 struct samba_sockaddr *return_ss,
+                 int name_type,
+                 bool prefer_ipv4)
 {
        struct samba_sockaddr *sa_list = NULL;
        char *sitename = NULL;
@@ -2987,7 +2987,13 @@ bool resolve_name(const char *name,
        TALLOC_CTX *frame = NULL;
 
        if (is_ipaddress(name)) {
-               return interpret_string_addr(return_ss, name, AI_NUMERICHOST);
+               struct sockaddr_storage ss;
+               bool ok = interpret_string_addr(&ss, name, AI_NUMERICHOST);
+               if (!ok) {
+                       return false;
+               }
+               sockaddr_storage_to_samba_sockaddr(return_ss, &ss);
+               return true;
        }
 
        frame = talloc_stackframe();
@@ -3008,7 +3014,7 @@ bool resolve_name(const char *name,
                        for (i=0; i<count; i++) {
                                if (!is_broadcast_addr(&sa_list[i].u.sa) &&
                                                (sa_list[i].u.ss.ss_family == AF_INET)) {
-                                       *return_ss = sa_list[i].u.ss;
+                                       *return_ss = sa_list[i];
                                        TALLOC_FREE(sa_list);
                                        TALLOC_FREE(frame);
                                        return True;
@@ -3019,7 +3025,7 @@ bool resolve_name(const char *name,
                /* only return valid addresses for TCP connections */
                for (i=0; i<count; i++) {
                        if (!is_broadcast_addr(&sa_list[i].u.sa)) {
-                               *return_ss = sa_list[i].u.ss;
+                               *return_ss = sa_list[i];
                                TALLOC_FREE(sa_list);
                                TALLOC_FREE(frame);
                                return True;
@@ -3430,7 +3436,7 @@ static NTSTATUS get_dc_list(TALLOC_CTX *ctx,
 
                /* explicit lookup; resolve_name() will
                 * handle names & IP addresses */
-               if (resolve_name(name, &name_sa.u.ss, 0x20, true)) {
+               if (resolve_name(name, &name_sa, 0x20, true)) {
                        char addr[INET6_ADDRSTRLEN];
                        bool has_entry;
                        bool ok;
index 16559f9cd26f673f459a48b3203728dbd92d709a..31e4d760465ac52cc8251e3531ae0da0827fd72b 100644 (file)
@@ -92,9 +92,9 @@ NTSTATUS internal_resolve_name(TALLOC_CTX *ctx,
                                size_t *ret_count,
                                const char **resolve_order);
 bool resolve_name(const char *name,
-               struct sockaddr_storage *return_ss,
-               int name_type,
-               bool prefer_ipv4);
+                 struct samba_sockaddr *return_ss,
+                 int name_type,
+                 bool prefer_ipv4);
 NTSTATUS resolve_name_list(TALLOC_CTX *ctx,
                const char *name,
                int name_type,
index 002ead6d5f914cd9a03bcdcf53010debc65339e1..81339ad0c20a3e0892ff8b9f9738be1231836072 100644 (file)
@@ -4008,7 +4008,7 @@ static NTSTATUS cli_rpc_pipe_open(struct cli_state *cli,
                bool ok;
 
                ok = resolve_name(remote_name,
-                                 &saddr.u.ss,
+                                 &saddr,
                                  NBT_NAME_SERVER,
                                  false);
                if (!ok) {
index fb11107929823365221901fe3e72b60714d8b282..5050f4ccfac59ba9c8d7ff5e3b7a1af15544e336 100644 (file)
@@ -2461,7 +2461,7 @@ static bool spoolss_connect_to_client(struct rpc_pipe_client **pp_pipe, struct c
                                      struct sockaddr_storage *client_ss, const char *remote_machine)
 {
        NTSTATUS ret;
-       struct sockaddr_storage rm_addr;
+       struct samba_sockaddr rm_addr;
        char addr[INET6_ADDRSTRLEN];
        struct cli_credentials *anon_creds = NULL;
        struct smb_transports ts =
@@ -2475,10 +2475,10 @@ static bool spoolss_connect_to_client(struct rpc_pipe_client **pp_pipe, struct c
                        DEBUG(2,("spoolss_connect_to_client: Can't resolve address for %s\n", remote_machine));
                        return false;
                }
-               print_sockaddr(addr, sizeof(addr), &rm_addr);
+               print_sockaddr(addr, sizeof(addr), &rm_addr.u.ss);
        } else {
-               rm_addr = *client_ss;
-               print_sockaddr(addr, sizeof(addr), &rm_addr);
+               sockaddr_storage_to_samba_sockaddr(&rm_addr, client_ss);
+               print_sockaddr(addr, sizeof(addr), &rm_addr.u.ss);
                DEBUG(5,("spoolss_connect_to_client: Using address %s (no name resolution necessary)\n",
                        addr));
        }
@@ -2500,7 +2500,7 @@ static bool spoolss_connect_to_client(struct rpc_pipe_client **pp_pipe, struct c
                                        pp_cli,
                                        lp_netbios_name(),
                                        remote_machine,
-                                       &rm_addr,
+                                       &rm_addr.u.ss,
                                        &ts,
                                        "IPC$",
                                        "IPC",
index a8c19ef4a0e421e7497b749a1a28e4ce9862d6b3..6bdc02c2374ac6b55def452b2b819b85453b0bb1 100644 (file)
@@ -621,7 +621,7 @@ static bool netbios_session_retarget(struct smbXsrv_connection *xconn,
        char *p;
        int retarget_type = 0x20;
        int retarget_port = NBT_SMB_PORT;
-       struct sockaddr_storage retarget_addr;
+       struct samba_sockaddr retarget_addr;
        struct sockaddr_in *in_addr;
        bool ret = false;
        uint8_t outbuf[10];
@@ -679,12 +679,12 @@ static bool netbios_session_retarget(struct smbXsrv_connection *xconn,
                goto fail;
        }
 
-       if (retarget_addr.ss_family != AF_INET) {
+       if (retarget_addr.u.ss.ss_family != AF_INET) {
                DEBUG(10, ("Retarget target not an IPv4 addr\n"));
                goto fail;
        }
 
-       in_addr = (struct sockaddr_in *)(void *)&retarget_addr;
+       in_addr = &retarget_addr.u.in;
 
        _smb_setlen(outbuf, 6);
        SCVAL(outbuf, 0, 0x84);
index 31d43afbfa46e0ba6e540f355be456e1333e22a0..49bec2b6112d6ac0b219205e9bdfe09fa1bfe146 100644 (file)
@@ -4151,7 +4151,7 @@ static bool run_negprot_nowait(int dummy)
 static bool run_bad_nbt_session(int dummy)
 {
        struct nmb_name called, calling;
-       struct sockaddr_storage ss;
+       struct samba_sockaddr ss;
        NTSTATUS status;
        int fd;
        bool ret;
@@ -4166,7 +4166,7 @@ static bool run_bad_nbt_session(int dummy)
                return false;
        }
 
-       status = open_socket_out(&ss, NBT_SMB_PORT, 10000, &fd);
+       status = open_socket_out(&ss.u.ss, NBT_SMB_PORT, 10000, &fd);
        if (!NT_STATUS_IS_OK(status)) {
                d_fprintf(stderr, "open_socket_out failed: %s\n",
                          nt_errstr(status));
@@ -12492,7 +12492,7 @@ static bool run_tldap(int dummy)
        int fd;
        TLDAPRC rc;
        NTSTATUS status;
-       struct sockaddr_storage addr;
+       struct samba_sockaddr addr;
        struct tevent_context *ev;
        struct tevent_req *req;
        char *basedn;
@@ -12530,7 +12530,7 @@ static bool run_tldap(int dummy)
                d_printf("could not find host %s\n", host);
                return false;
        }
-       status = open_socket_out(&addr, tcp_port, 9999, &fd);
+       status = open_socket_out(&addr.u.ss, tcp_port, 9999, &fd);
        if (!NT_STATUS_IS_OK(status)) {
                d_printf("open_socket_out failed: %s\n", nt_errstr(status));
                return false;
@@ -15113,7 +15113,7 @@ static bool run_smb1_truncated_sesssetup(int dummy)
        };
        struct smbXcli_transport *xtp = NULL;
        struct smbXcli_conn *conn;
-       struct sockaddr_storage ss;
+       struct samba_sockaddr ss;
        NTSTATUS status;
        int fd;
        bool ok;
@@ -15126,7 +15126,7 @@ static bool run_smb1_truncated_sesssetup(int dummy)
                return false;
        }
 
-       status = open_socket_out(&ss, 445, 10000, &fd);
+       status = open_socket_out(&ss.u.ss, 445, 10000, &fd);
        if (!NT_STATUS_IS_OK(status)) {
                d_fprintf(stderr, "open_socket_out failed: %s\n",
                          nt_errstr(status));
@@ -15316,7 +15316,7 @@ static bool run_smb1_negotiate_exit(int dummy)
        };
        struct smbXcli_transport *xtp = NULL;
        struct smbXcli_conn *conn;
-       struct sockaddr_storage ss;
+       struct samba_sockaddr ss;
        NTSTATUS status;
        int fd;
        bool ok;
@@ -15329,7 +15329,7 @@ static bool run_smb1_negotiate_exit(int dummy)
                return false;
        }
 
-       status = open_socket_out(&ss, 445, 10000, &fd);
+       status = open_socket_out(&ss.u.ss, 445, 10000, &fd);
        if (!NT_STATUS_IS_OK(status)) {
                d_fprintf(stderr, "open_socket_out failed: %s\n",
                          nt_errstr(status));
@@ -15441,7 +15441,7 @@ static bool run_ign_bad_negprot(int dummy)
        };
        struct smbXcli_transport *xtp = NULL;
        struct smbXcli_conn *conn;
-       struct sockaddr_storage ss;
+       struct samba_sockaddr ss;
        NTSTATUS status;
        int fd;
        bool ok;
@@ -15454,7 +15454,7 @@ static bool run_ign_bad_negprot(int dummy)
                return false;
        }
 
-       status = open_socket_out(&ss, 445, 10000, &fd);
+       status = open_socket_out(&ss.u.ss, 445, 10000, &fd);
        if (!NT_STATUS_IS_OK(status)) {
                d_fprintf(stderr, "open_socket_out failed: %s\n",
                          nt_errstr(status));
index c1f054684ffed4a5a95cefa033cff6ac848fcb47..fec639b7272a51159ef51dcd371d95fcf5e34eb6 100644 (file)
@@ -2251,7 +2251,7 @@ static int net_ads_printer_publish(struct net_context *c,
        const char *printername = NULL;
        struct cli_state *cli = NULL;
        struct rpc_pipe_client *pipe_hnd = NULL;
-       struct sockaddr_storage server_ss = { 0 };
+       struct samba_sockaddr server_ss = { 0 };
        NTSTATUS nt_status;
        ADS_MODLIST mods = NULL;
        char *prt_dn = NULL;
@@ -2313,7 +2313,7 @@ static int net_ads_printer_publish(struct net_context *c,
                                              &cli,
                                              lp_netbios_name(),
                                              servername,
-                                             &server_ss,
+                                             &server_ss.u.ss,
                                              &ts,
                                              "IPC$",
                                              "IPC",
index 33433830b4f70b0dd39dd97c179d80988807938c..f104c4006c842e22fbc903f40c4637ec2a110a44 100644 (file)
@@ -46,7 +46,7 @@ int net_lookup_usage(struct net_context *c, int argc, const char **argv)
 /* lookup a hostname giving an IP */
 static int net_lookup_host(struct net_context *c, int argc, const char **argv)
 {
-       struct sockaddr_storage ss;
+       struct samba_sockaddr ss;
        int name_type = 0x20;
        char addr[INET6_ADDRSTRLEN];
        const char *name = argv[0];
@@ -68,7 +68,7 @@ static int net_lookup_host(struct net_context *c, int argc, const char **argv)
                return -1;
        }
 
-       print_sockaddr(addr, sizeof(addr), &ss);
+       print_sockaddr(addr, sizeof(addr), &ss.u.ss);
        d_printf("%s\n", addr);
        return 0;
 }
index eb6457073d810f3eb9f5f32cf74686e689d61133..bd1bcb22c0f10d7eca3f1ae4f14560e36897240c 100644 (file)
@@ -297,11 +297,13 @@ bool net_find_server(struct net_context *c,
                        *server_name = SMB_STRDUP(addr);
                }
        } else if (*server_name) {
+               struct samba_sockaddr ss;
                /* resolve the IP address */
-               if (!resolve_name(*server_name, server_ss, 0x20, false))  {
+               if (!resolve_name(*server_name, &ss, 0x20, false))  {
                        DEBUG(1,("Unable to resolve server name\n"));
                        return false;
                }
+               *server_ss = ss.u.ss;
        } else if (flags & NET_FLAGS_PDC) {
                fstring dc_name;
                struct sockaddr_storage pdc_ss;
@@ -322,7 +324,7 @@ bool net_find_server(struct net_context *c,
                *server_name = SMB_STRDUP(dc_name);
                *server_ss = pdc_ss;
        } else if (flags & NET_FLAGS_DMB) {
-               struct sockaddr_storage msbrow_ss;
+               struct samba_sockaddr msbrow_ss;
                char addr[INET6_ADDRSTRLEN];
 
                /*  if (!resolve_name(MSBROWSE, &msbrow_ip, 1, false)) */
@@ -330,18 +332,18 @@ bool net_find_server(struct net_context *c,
                        DEBUG(1,("Unable to resolve domain browser via name lookup\n"));
                        return false;
                }
-               *server_ss = msbrow_ss;
+               *server_ss = msbrow_ss.u.ss;
                print_sockaddr(addr, sizeof(addr), server_ss);
                *server_name = SMB_STRDUP(addr);
        } else if (flags & NET_FLAGS_MASTER) {
-               struct sockaddr_storage brow_ss;
+               struct samba_sockaddr brow_ss;
                char addr[INET6_ADDRSTRLEN];
                if (!resolve_name(d, &brow_ss, 0x1D, false))  {
                                /* go looking for workgroups */
                        DEBUG(1,("Unable to resolve master browser via name lookup\n"));
                        return false;
                }
-               *server_ss = brow_ss;
+               *server_ss = brow_ss.u.ss;
                print_sockaddr(addr, sizeof(addr), server_ss);
                *server_name = SMB_STRDUP(addr);
        } else if (!(flags & NET_FLAGS_LOCALHOST_DEFAULT_INSANE)) {
index ebf2809750091c01db7875a1078a2c84c505b8be..70c444cb7f2b41b5dd691626657a4ac2857202df 100644 (file)
@@ -276,7 +276,7 @@ static void filter_child(int c, struct sockaddr_storage *dest_ss)
 static void start_filter(char *desthost)
 {
        int s, c;
-       struct sockaddr_storage dest_ss;
+       struct samba_sockaddr dest_ss;
        struct sockaddr_storage my_ss;
 
        CatchChild();
@@ -312,7 +312,7 @@ static void start_filter(char *desthost)
                                smb_set_close_on_exec(c);
                                if (fork() == 0) {
                                        close(s);
-                                       filter_child(c, &dest_ss);
+                                       filter_child(c, &dest_ss.u.ss);
                                        exit(0);
                                } else {
                                        close(c);
index 36aaa4f0a8eb67d4b5bcd66b04764ffe314e7cc0..361d0052241f048d0f751b82206dc9b7ea5e8997 100644 (file)
@@ -300,9 +300,7 @@ static NTSTATUS idmap_ad_get_tldap_ctx(TALLOC_CTX *mem_ctx,
                                       struct tldap_context **pld)
 {
        struct netr_DsRGetDCNameInfo *dcinfo;
-       struct sockaddr_storage dcaddr = {
-               .ss_family = AF_UNSPEC,
-       };
+       struct samba_sockaddr dcaddr = {};
        struct sockaddr_storage *pdcaddr = NULL;
        struct winbindd_domain *creds_domain = NULL;
        struct cli_credentials *creds;
@@ -372,7 +370,7 @@ static NTSTATUS idmap_ad_get_tldap_ctx(TALLOC_CTX *mem_ctx,
         */
        if (strequal(domname, lp_realm()) || strequal(domname, lp_workgroup()))
        {
-               pdcaddr = &dcaddr;
+               pdcaddr = &dcaddr.u.ss;
        }
 
        ok = create_local_private_krb5_conf_for_domain(
@@ -384,7 +382,7 @@ static NTSTATUS idmap_ad_get_tldap_ctx(TALLOC_CTX *mem_ctx,
                return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
        }
 
-       status = open_socket_out(&dcaddr, tcp_port, 10000, &fd);
+       status = open_socket_out(&dcaddr.u.ss, tcp_port, 10000, &fd);
        if (!NT_STATUS_IS_OK(status)) {
                DBG_DEBUG("open_socket_out failed: %s\n", nt_errstr(status));
                TALLOC_FREE(dcinfo);
index 81013fcb09988b3bb95846b0195a3987fba2c994..a47ccfa19cdd87e64f4075e0bd65cc788ab36171 100644 (file)
@@ -1443,13 +1443,15 @@ static bool connect_preferred_dc(TALLOC_CTX *mem_ctx,
                                return false;
                        }
                } else {
+                       struct samba_sockaddr dcaddr;
                        ok = resolve_name(saf_servername,
-                                         &domain->dcaddr,
+                                         &dcaddr,
                                          0x20,
                                          true);
                        if (!ok) {
                                goto fail;
                        }
+                       domain->dcaddr = dcaddr.u.ss;
                }
 
                TALLOC_FREE(domain->dcname);