[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