[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Tue Aug 25 17:44:03 UTC 2020


The branch, master has been updated
       via  102e2a26d3c s3: libsmb: Cleanup - remove an ugly sockaddr_in cast inside resolve_wins_send().
       via  ce84521c7c0 s3: libads: Cleanup - Remove two more ugly const struct sockaddr * casts in get_kdc_ip_string().
       via  a388f791503 s3: libsmb: Cleanup - Pass samba_sockaddr directly to nb_trans_send().
       via  5151278ccc1 s3: libsmb: Cleanup - Remove a union in sock_packet_read_got_socket() that was an early attempt a samba_sockaddr.
       via  189c741052f s3: libsmb: Cleanup - Remove the last two sockaddr casts in namequery.c in name_query_validator().
       via  54454b30ff7 s3: libsmb: Cleanup - Remove two more sockaddr casts inside remove_duplicate_addrs2().
       via  2056b0d9c3f s3: libsmb: Cleanup - Use samba_sockaddr as intended in resolve_name() to make ugly casts go away.
       via  a559eebc145 s3: libsmb: Cleanup - convert addr_compare() to using samba_sockaddr internally.
       via  0ef885c02d0 s3: libsmb: Cleanup - make name_query_send() use samba_sockaddr internally.
       via  d67c4a84dd9 s3: libsmb: Cleanup - make name_status_lmhosts() use samba_sockaddr internally.
       via  fa6d5bb3c97 s3: libsmb: Cleanup - make node_status_query_send() use samba_sockaddr internally.
       via  e3d9962ed3b s3: libsmb: Cleanup - Longlines cleanup for README.Coding standards.
       via  fbc65a24338 s3: libsmb: Cleanup - change parameter and callers of set_socket_addr_v4() to samba_sockaddr.
       via  928fb892739 s3: libsmb: Cleanup - Remove one call to set_socket_addr_v4().
      from  9d935795ea5 Fix FTBFS / Increase the over-estimation for sparse files

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 102e2a26d3c48c67a9b1e63de132786cb2cf8b4e
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 15:35:32 2020 -0700

    s3: libsmb: Cleanup - remove an ugly sockaddr_in cast inside resolve_wins_send().
    
    Use samba_sockaddr for its intended purpose.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Tue Aug 25 17:43:17 UTC 2020 on sn-devel-184

commit ce84521c7c0889c847a4d0a8b0c622333b7ca0da
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 12:11:33 2020 -0700

    s3: libads: Cleanup - Remove two more ugly const struct sockaddr * casts in get_kdc_ip_string().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

commit a388f7915039b4e3d698b1ae9746678d03358003
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 12:04:16 2020 -0700

    s3: libsmb: Cleanup - Pass samba_sockaddr directly to nb_trans_send().
    
    Saves an ugly internal cast. We know this must be AF_INET.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

commit 5151278ccc1d36ec8a62ecc7a55de50bd591c3d3
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 12:00:29 2020 -0700

    s3: libsmb: Cleanup - Remove a union in sock_packet_read_got_socket() that was an early attempt a samba_sockaddr.
    
    Just use samba_sockaddr.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

commit 189c741052f09ec2fd1aff52cdd006ae5a42af20
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 11:57:59 2020 -0700

    s3: libsmb: Cleanup - Remove the last two sockaddr casts in namequery.c in name_query_validator().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

commit 54454b30ff7da2af857b3fcc31ece6f2b39cfb09
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 11:54:26 2020 -0700

    s3: libsmb: Cleanup - Remove two more sockaddr casts inside remove_duplicate_addrs2().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

commit 2056b0d9c3feb553882e598042c5b56be4974412
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 11:49:25 2020 -0700

    s3: libsmb: Cleanup - Use samba_sockaddr as intended in resolve_name() to make ugly casts go away.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

commit a559eebc145fabdfd1053ac1985654e8116792cc
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 11:32:52 2020 -0700

    s3: libsmb: Cleanup - convert addr_compare() to using samba_sockaddr internally.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

commit 0ef885c02d0450eb5c0bb44616ae6d10fc12d1dd
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 11:26:23 2020 -0700

    s3: libsmb: Cleanup - make name_query_send() use samba_sockaddr internally.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

commit d67c4a84dd978b388c7d26de7f4119f22a594f0e
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 11:23:53 2020 -0700

    s3: libsmb: Cleanup - make name_status_lmhosts() use samba_sockaddr internally.
    
    Use existing utility function instead of direct memcmp.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

commit fa6d5bb3c97f124187f326d408e1fed02bf85ba1
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 11:19:29 2020 -0700

    s3: libsmb: Cleanup - make node_status_query_send() use samba_sockaddr internally.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

commit e3d9962ed3bd732f6adb3609984660f1e2be1173
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 11:16:11 2020 -0700

    s3: libsmb: Cleanup - Longlines cleanup for README.Coding standards.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

commit fbc65a2433848061a1a4a303c3e59a2391a520ca
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 11:12:03 2020 -0700

    s3: libsmb: Cleanup - change parameter and callers of set_socket_addr_v4() to samba_sockaddr.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

commit 928fb8927398ac8d4afc7e2276ff190ff33e72d1
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 24 11:05:11 2020 -0700

    s3: libsmb: Cleanup - Remove one call to set_socket_addr_v4().
    
    The stack variable sockaddr_storage ss wasn't being used at all.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: David Mulder <dmulder at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/libads/kerberos.c  |  31 +++++-
 source3/libsmb/namequery.c | 267 ++++++++++++++++++++++++++++++---------------
 2 files changed, 202 insertions(+), 96 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/libads/kerberos.c b/source3/libads/kerberos.c
index 5959da919b0..3fab68266f2 100644
--- a/source3/libads/kerberos.c
+++ b/source3/libads/kerberos.c
@@ -423,6 +423,7 @@ static char *get_kdc_ip_string(char *mem_ctx,
 	size_t i;
 	struct ip_service *ip_srv_site = NULL;
 	struct ip_service *ip_srv_nonsite = NULL;
+	struct samba_sockaddr sa = {0};
 	int count_site = 0;
 	int count_nonsite;
 	size_t num_dcs;
@@ -432,6 +433,7 @@ static char *get_kdc_ip_string(char *mem_ctx,
 	char *result = NULL;
 	struct netlogon_samlogon_response **responses = NULL;
 	NTSTATUS status;
+	bool ok;
 	char *kdc_str = talloc_asprintf(mem_ctx, "%s\t\tkdc = %s\n", "",
 					print_canonical_sockaddr_with_port(mem_ctx, pss));
 
@@ -440,6 +442,11 @@ static char *get_kdc_ip_string(char *mem_ctx,
 		return NULL;
 	}
 
+	ok = sockaddr_storage_to_samba_sockaddr(&sa, pss);
+	if (!ok) {
+		goto out;
+	}
+
 	/*
 	 * First get the KDC's only in this site, the rest will be
 	 * appended later
@@ -465,18 +472,30 @@ static char *get_kdc_ip_string(char *mem_ctx,
 	num_dcs = 0;
 
 	for (i = 0; i < count_site; i++) {
-		if (!sockaddr_equal(
-			(const struct sockaddr *)pss,
-			(const struct sockaddr *)&ip_srv_site[i].ss)) {
+		struct samba_sockaddr ip_sa = {0};
+
+		ok = sockaddr_storage_to_samba_sockaddr(&ip_sa,
+						&ip_srv_site[i].ss);
+		if (!ok) {
+			goto out;
+		}
+
+		if (!sockaddr_equal(&sa.u.sa, &ip_sa.u.sa)) {
 			add_sockaddr_unique(dc_addrs, &num_dcs,
 					    &ip_srv_site[i].ss);
 		}
 	}
 
 	for (i = 0; i < count_nonsite; i++) {
-		if (!sockaddr_equal(
-			(const struct sockaddr *)pss,
-			(const struct sockaddr *)&ip_srv_nonsite[i].ss)) {
+		struct samba_sockaddr ip_sa = {0};
+
+		ok = sockaddr_storage_to_samba_sockaddr(&ip_sa,
+						&ip_srv_nonsite[i].ss);
+		if (!ok) {
+			goto out;
+		}
+
+		if (!sockaddr_equal(&sa.u.sa, &ip_sa.u.sa)) {
 			add_sockaddr_unique(dc_addrs, &num_dcs,
 					    &ip_srv_nonsite[i].ss);
 		}
diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
index f85a2523740..af6efc63569 100644
--- a/source3/libsmb/namequery.c
+++ b/source3/libsmb/namequery.c
@@ -247,24 +247,27 @@ char *saf_fetch(TALLOC_CTX *mem_ctx, const char *domain )
 	return server;
 }
 
-static void set_socket_addr_v4(struct sockaddr_storage *addr)
+static void set_socket_addr_v4(struct samba_sockaddr *addr)
 {
-	if (!interpret_string_addr(addr, lp_nbt_client_socket_address(),
+	if (!interpret_string_addr(&addr->u.ss, lp_nbt_client_socket_address(),
 				   AI_NUMERICHOST|AI_PASSIVE)) {
-		zero_sockaddr(addr);
+		zero_sockaddr(&addr->u.ss);
+		/* zero_sockaddr sets family to AF_INET. */
+		addr->sa_socklen = sizeof(struct sockaddr_in);
 	}
-	if (addr->ss_family != AF_INET) {
-		zero_sockaddr(addr);
+	if (addr->u.ss.ss_family != AF_INET) {
+		zero_sockaddr(&addr->u.ss);
+		/* zero_sockaddr sets family to AF_INET. */
+		addr->sa_socklen = sizeof(struct sockaddr_in);
 	}
 }
 
 static struct in_addr my_socket_addr_v4(void)
 {
-	struct sockaddr_storage my_addr;
-	struct sockaddr_in *in_addr = (struct sockaddr_in *)((char *)&my_addr);
+	struct samba_sockaddr my_addr = {0};
 
 	set_socket_addr_v4(&my_addr);
-	return in_addr->sin_addr;
+	return my_addr.u.in.sin_addr;
 }
 
 /****************************************************************************
@@ -439,10 +442,7 @@ static void sock_packet_read_got_socket(struct tevent_req *subreq)
 		subreq, struct tevent_req);
 	struct sock_packet_read_state *state = tevent_req_data(
 		req, struct sock_packet_read_state);
-	union {
-		struct sockaddr sa;
-		struct sockaddr_in sin;
-	} addr;
+	struct samba_sockaddr addr = {0};
 	ssize_t ret;
 	ssize_t received;
 	int err;
@@ -471,8 +471,8 @@ static void sock_packet_read_got_socket(struct tevent_req *subreq)
 		goto retry;
 	}
 	ret = tsocket_address_bsd_sockaddr(state->addr,
-					   &addr.sa,
-					   sizeof(addr.sin));
+					&addr.u.sa,
+					sizeof(addr.u.in));
 	if (ret == -1) {
 		tevent_req_nterror(req, map_nt_error_from_unix(errno));
 		return;
@@ -480,7 +480,7 @@ static void sock_packet_read_got_socket(struct tevent_req *subreq)
 
 	state->packet = parse_packet_talloc(
 		state, (char *)state->buf, received, state->type,
-		addr.sin.sin_addr, addr.sin.sin_port);
+		addr.u.in.sin_addr, addr.u.in.sin_port);
 	if (state->packet == NULL) {
 		DEBUG(10, ("parse_packet failed\n"));
 		goto retry;
@@ -556,8 +556,8 @@ static void nb_trans_send_next(struct tevent_req *subreq);
 static struct tevent_req *nb_trans_send(
 	TALLOC_CTX *mem_ctx,
 	struct tevent_context *ev,
-	const struct sockaddr_storage *_my_addr,
-	const struct sockaddr_storage *_dst_addr,
+	const struct samba_sockaddr *_my_addr,
+	const struct samba_sockaddr *_dst_addr,
 	bool bcast,
 	uint8_t *buf, size_t buflen,
 	enum packet_type type, int trn_id,
@@ -565,12 +565,10 @@ static struct tevent_req *nb_trans_send(
 			  void *private_data),
 	void *private_data)
 {
-	const struct sockaddr *my_addr =
-		discard_const_p(const struct sockaddr, _my_addr);
-	size_t my_addr_len = sizeof(*_my_addr);
-	const struct sockaddr *dst_addr =
-		discard_const_p(const struct sockaddr, _dst_addr);
-	size_t dst_addr_len = sizeof(*_dst_addr);
+	const struct sockaddr *my_addr = &_my_addr->u.sa;
+	size_t my_addr_len = sizeof(_my_addr->u.in); /*We know it's AF_INET.*/
+	const struct sockaddr *dst_addr = &_dst_addr->u.sa;
+	size_t dst_addr_len = sizeof(_dst_addr->u.in); /*We know it's AF_INET.*/
 	struct tevent_req *req, *subreq;
 	struct nb_trans_state *state;
 	int ret;
@@ -737,8 +735,8 @@ static NTSTATUS nb_trans_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
 **************************************************************************/
 
 struct node_status_query_state {
-	struct sockaddr_storage my_addr;
-	struct sockaddr_storage addr;
+	struct samba_sockaddr my_addr;
+	struct samba_sockaddr addr;
 	uint8_t buf[1024];
 	ssize_t buflen;
 	struct packet_struct *packet;
@@ -757,7 +755,7 @@ struct tevent_req *node_status_query_send(TALLOC_CTX *mem_ctx,
 	struct node_status_query_state *state;
 	struct packet_struct p;
 	struct nmb_packet *nmb = &p.packet.nmb;
-	struct sockaddr_in *in_addr;
+	bool ok;
 
 	req = tevent_req_create(mem_ctx, &state,
 				struct node_status_query_state);
@@ -771,9 +769,13 @@ struct tevent_req *node_status_query_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
-	state->addr = *addr;
-	in_addr = (struct sockaddr_in *)(void *)&state->addr;
-	in_addr->sin_port = htons(NMB_PORT);
+	ok = sockaddr_storage_to_samba_sockaddr(&state->addr, addr);
+	if (!ok) {
+		/* node status must be IPv4 */
+		tevent_req_nterror(req, NT_STATUS_INVALID_ADDRESS);
+		return tevent_req_post(req, ev);
+	}
+	state->addr.u.in.sin_port = htons(NMB_PORT);
 
 	set_socket_addr_v4(&state->my_addr);
 
@@ -803,10 +805,17 @@ struct tevent_req *node_status_query_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
-	subreq = nb_trans_send(state, ev, &state->my_addr, &state->addr, false,
-			       state->buf, state->buflen,
-			       NMB_PACKET, nmb->header.name_trn_id,
-			       node_status_query_validator, NULL);
+	subreq = nb_trans_send(state,
+				ev,
+				&state->my_addr,
+				&state->addr,
+				false,
+				state->buf,
+				state->buflen,
+				NMB_PACKET,
+				nmb->header.name_trn_id,
+				node_status_query_validator,
+				NULL);
 	if (tevent_req_nomem(subreq, req)) {
 		DEBUG(10, ("nb_trans_send failed\n"));
 		return tevent_req_post(req, ev);
@@ -914,9 +923,15 @@ static bool name_status_lmhosts(const struct sockaddr_storage *paddr,
 	FILE *f;
 	char *name;
 	int name_type;
-	struct sockaddr_storage addr;
+	struct samba_sockaddr addr_in = {0};
+	struct samba_sockaddr addr = {0};
+	bool ok;
 
-	if (paddr->ss_family != AF_INET) {
+	ok = sockaddr_storage_to_samba_sockaddr(&addr_in, paddr);
+	if (!ok) {
+		return false;
+	}
+	if (addr_in.u.ss.ss_family != AF_INET) {
 		return false;
 	}
 
@@ -925,16 +940,14 @@ static bool name_status_lmhosts(const struct sockaddr_storage *paddr,
 		return false;
 	}
 
-	while (getlmhostsent(talloc_tos(), f, &name, &name_type, &addr)) {
-		if (addr.ss_family != AF_INET) {
+	while (getlmhostsent(talloc_tos(), f, &name, &name_type, &addr.u.ss)) {
+		if (addr.u.ss.ss_family != AF_INET) {
 			continue;
 		}
 		if (name_type != qname_type) {
 			continue;
 		}
-		if (memcmp(&((const struct sockaddr_in *)paddr)->sin_addr,
-			   &((const struct sockaddr_in *)&addr)->sin_addr,
-			   sizeof(struct in_addr)) == 0) {
+		if (sockaddr_equal(&addr_in.u.sa, &addr.u.sa)) {
 			fstrcpy(pname, name);
 			endlmhosts(f);
 			return true;
@@ -956,7 +969,6 @@ bool name_status_find(const char *q_name,
 			fstring name)
 {
 	char addr[INET6_ADDRSTRLEN];
-	struct sockaddr_storage ss;
 	struct node_status *addrs = NULL;
 	struct nmb_name nname;
 	int count = 0, i;
@@ -992,8 +1004,6 @@ bool name_status_find(const char *q_name,
 		return true;
 	}
 
-	set_socket_addr_v4(&ss);
-
 	/* W2K PDC's seem not to respond to '*'#0. JRA */
 	make_nmb_name(&nname, q_name, q_type);
 	status = node_status_query(talloc_tos(), &nname, to_ss,
@@ -1045,10 +1055,23 @@ static int addr_compare(const struct sockaddr_storage *ss1,
 	int max_bits1=0, max_bits2=0;
 	int num_interfaces = iface_count();
 	int i;
+	struct samba_sockaddr sa1;
+	struct samba_sockaddr sa2;
+	bool ok;
+
+	ok = sockaddr_storage_to_samba_sockaddr(&sa1, ss1);
+	if (!ok) {
+		return 0; /* No change. */
+	}
+
+	ok = sockaddr_storage_to_samba_sockaddr(&sa2, ss2);
+	if (!ok) {
+		return 0; /* No change. */
+	}
 
 	/* Sort IPv4 addresses first. */
-	if (ss1->ss_family != ss2->ss_family) {
-		if (ss2->ss_family == AF_INET) {
+	if (sa1.u.ss.ss_family != sa2.u.ss.ss_family) {
+		if (sa2.u.ss.ss_family == AF_INET) {
 			return 1;
 		} else {
 			return -1;
@@ -1059,34 +1082,32 @@ static int addr_compare(const struct sockaddr_storage *ss1,
 	 * family. */
 
 	for (i=0;i<num_interfaces;i++) {
-		const struct sockaddr_storage *pss = iface_n_bcast(i);
+		struct samba_sockaddr sif = {0};
 		const unsigned char *p_ss1 = NULL;
 		const unsigned char *p_ss2 = NULL;
 		const unsigned char *p_if = NULL;
 		size_t len = 0;
 		int bits1, bits2;
 
-		if (pss->ss_family != ss1->ss_family) {
+		ok = sockaddr_storage_to_samba_sockaddr(&sif, iface_n_bcast(i));
+		if (!ok) {
+			return 0; /* No change. */
+		}
+		if (sif.u.ss.ss_family != sa1.u.ss.ss_family) {
 			/* Ignore interfaces of the wrong type. */
 			continue;
 		}
-		if (pss->ss_family == AF_INET) {
-			p_if = (const unsigned char *)
-				&((const struct sockaddr_in *)pss)->sin_addr;
-			p_ss1 = (const unsigned char *)
-				&((const struct sockaddr_in *)ss1)->sin_addr;
-			p_ss2 = (const unsigned char *)
-				&((const struct sockaddr_in *)ss2)->sin_addr;
+		if (sif.u.ss.ss_family == AF_INET) {
+			p_if = (const unsigned char *)&sif.u.in.sin_addr;
+			p_ss1 = (const unsigned char *)&sa1.u.in.sin_addr;
+			p_ss2 = (const unsigned char *)&sa2.u.in.sin_addr;
 			len = 4;
 		}
 #if defined(HAVE_IPV6)
-		if (pss->ss_family == AF_INET6) {
-			p_if = (const unsigned char *)
-				&((const struct sockaddr_in6 *)pss)->sin6_addr;
-			p_ss1 = (const unsigned char *)
-				&((const struct sockaddr_in6 *)ss1)->sin6_addr;
-			p_ss2 = (const unsigned char *)
-				&((const struct sockaddr_in6 *)ss2)->sin6_addr;
+		if (sif.u.ss.ss_family == AF_INET6) {
+			p_if = (const unsigned char *)&sif.u.in6.sin6_addr;
+			p_ss1 = (const unsigned char *)&sa1.u.in6.sin6_addr;
+			p_ss2 = (const unsigned char *)&sa2.u.in6.sin6_addr;
 			len = 16;
 		}
 #endif
@@ -1100,15 +1121,15 @@ static int addr_compare(const struct sockaddr_storage *ss1,
 	}
 
 	/* Bias towards directly reachable IPs */
-	if (iface_local((const struct sockaddr *)ss1)) {
-		if (ss1->ss_family == AF_INET) {
+	if (iface_local(&sa1.u.sa)) {
+		if (sa1.u.ss.ss_family == AF_INET) {
 			max_bits1 += 32;
 		} else {
 			max_bits1 += 128;
 		}
 	}
-	if (iface_local((const struct sockaddr *)ss2)) {
-		if (ss2->ss_family == AF_INET) {
+	if (iface_local(&sa2.u.sa)) {
+		if (sa2.u.ss.ss_family == AF_INET) {
 			max_bits2 += 32;
 		} else {
 			max_bits2 += 128;
@@ -1177,13 +1198,28 @@ int remove_duplicate_addrs2(struct ip_service *iplist, int count )
 
 	/* One loop to set duplicates to a zero addr. */
 	for ( i=0; i<count; i++ ) {
-		if ( is_zero_addr(&iplist[i].ss)) {
+		bool ok;
+		struct samba_sockaddr sa_i = {0};
+
+		ok = sockaddr_storage_to_samba_sockaddr(&sa_i, &iplist[i].ss);
+		if (!ok) {
+			continue;
+		}
+
+		if (is_zero_addr(&sa_i.u.ss)) {
 			continue;
 		}
 
 		for ( j=i+1; j<count; j++ ) {
-			if (sockaddr_equal((struct sockaddr *)(void *)&iplist[i].ss,
-					   (struct sockaddr *)(void *)&iplist[j].ss) &&
+			struct samba_sockaddr sa_j = {0};
+
+			ok = sockaddr_storage_to_samba_sockaddr(&sa_j,
+							&iplist[j].ss);
+			if (!ok) {
+				continue;
+			}
+
+			if (sockaddr_equal(&sa_i.u.sa, &sa_j.u.sa) &&
 					iplist[i].port == iplist[j].port) {
 				zero_sockaddr(&iplist[j].ss);
 			}
@@ -1242,8 +1278,8 @@ static bool prioritize_ipv4_list(struct ip_service *iplist, int count)
 ****************************************************************************/
 
 struct name_query_state {
-	struct sockaddr_storage my_addr;
-	struct sockaddr_storage addr;
+	struct samba_sockaddr my_addr;
+	struct samba_sockaddr addr;
 	bool bcast;
 	bool bcast_star_query;
 
@@ -1271,7 +1307,7 @@ struct tevent_req *name_query_send(TALLOC_CTX *mem_ctx,
 	struct name_query_state *state;
 	struct packet_struct p;
 	struct nmb_packet *nmb = &p.packet.nmb;
-	struct sockaddr_in *in_addr;
+	bool ok;
 
 	req = tevent_req_create(mem_ctx, &state, struct name_query_state);
 	if (req == NULL) {
@@ -1292,9 +1328,13 @@ struct tevent_req *name_query_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
-	state->addr = *addr;
-	in_addr = (struct sockaddr_in *)(void *)&state->addr;
-	in_addr->sin_port = htons(NMB_PORT);
+	ok = sockaddr_storage_to_samba_sockaddr(&state->addr, addr);
+	if (!ok) {
+		/* Node status must be IPv4 */
+		tevent_req_nterror(req, NT_STATUS_INVALID_ADDRESS);
+		return tevent_req_post(req, ev);
+	}
+	state->addr.u.in.sin_port = htons(NMB_PORT);
 
 	set_socket_addr_v4(&state->my_addr);
 
@@ -1336,10 +1376,17 @@ struct tevent_req *name_query_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
-	subreq = nb_trans_send(state, ev, &state->my_addr, &state->addr, bcast,
-			       state->buf, state->buflen,
-			       NMB_PACKET, nmb->header.name_trn_id,
-			       name_query_validator, state);
+	subreq = nb_trans_send(state,
+				ev,
+				&state->my_addr,
+				&state->addr,
+				bcast,
+				state->buf,
+				state->buflen,
+				NMB_PACKET,
+				nmb->header.name_trn_id,
+				name_query_validator,
+				state);
 	if (tevent_req_nomem(subreq, req)) {
 		DEBUG(10, ("nb_trans_send failed\n"));
 		return tevent_req_post(req, ev);
@@ -1432,6 +1479,8 @@ static bool name_query_validator(struct packet_struct *p, void *private_data)
 		uint16_t flags;
 		struct in_addr ip;
 		struct sockaddr_storage addr;
+		struct samba_sockaddr sa = {0};
+		bool ok;
 		int j;
 
 		flags = RSVAL(&nmb->answers->rdata[i*6], 0);
@@ -1440,14 +1489,24 @@ static bool name_query_validator(struct packet_struct *p, void *private_data)
 		putip((char *)&ip,&nmb->answers->rdata[2+i*6]);
 		in_addr_to_sockaddr_storage(&addr, ip);
 
-		if (is_zero_addr(&addr)) {
+		ok = sockaddr_storage_to_samba_sockaddr(&sa, &addr);
+		if (!ok) {
+			continue;
+		}
+
+		if (is_zero_addr(&sa.u.ss)) {
 			continue;
 		}
 
 		for (j=0; j<state->num_addrs; j++) {
-			if (sockaddr_equal(
-				    (struct sockaddr *)(void *)&addr,
-				    (struct sockaddr *)(void *)&state->addrs[j])) {
+			struct samba_sockaddr sa_j = {0};
+
+			ok = sockaddr_storage_to_samba_sockaddr(&sa_j,
+						&state->addrs[j]);


-- 
Samba Shared Repository



More information about the samba-cvs mailing list