summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/nbt_server/interfaces.c35
-rw-r--r--source4/nbt_server/wins/winsdb.c11
-rw-r--r--source4/nbt_server/wins/winsserver.c8
3 files changed, 23 insertions, 31 deletions
diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c
index f2ccc1c424..f607c070d8 100644
--- a/source4/nbt_server/interfaces.c
+++ b/source4/nbt_server/interfaces.c
@@ -251,43 +251,32 @@ const char **nbtd_address_list(struct nbtd_interface *iface, TALLOC_CTX *mem_ctx
struct nbtd_server *nbtsrv = iface->nbtsrv;
const char **ret = NULL;
struct nbtd_interface *iface2;
- int count = 0;
if (iface->ip_address) {
- ret = talloc_array(mem_ctx, const char *, 2);
- if (ret == NULL) goto failed;
-
- ret[0] = talloc_strdup(ret, iface->ip_address);
- if (ret[0] == NULL) goto failed;
- ret[1] = NULL;
-
- count = 1;
+ ret = str_list_add(ret, iface->ip_address);
}
for (iface2=nbtsrv->interfaces;iface2;iface2=iface2->next) {
- const char **ret2;
-
if (iface->ip_address &&
strcmp(iface2->ip_address, iface->ip_address) == 0) {
continue;
}
- ret2 = talloc_realloc(mem_ctx, ret, const char *, count+2);
- if (ret2 == NULL) goto failed;
- ret = ret2;
- ret[count] = talloc_strdup(ret, iface2->ip_address);
- if (ret[count] == NULL) goto failed;
- count++;
+ ret = str_list_add(ret, iface2->ip_address);
}
- if (ret == NULL) goto failed;
+ talloc_steal(mem_ctx, ret);
- ret[count] = NULL;
- return ret;
+ /* if the query didn't come from loopback, then never give out
+ loopback in the reply, as loopback means something
+ different for the recipient than for us */
+ if (ret != NULL &&
+ iface->ip_address != NULL &&
+ strcmp(iface->ip_address, "127.0.0.1") != 0) {
+ str_list_remove(ret, "127.0.0.1");
+ }
-failed:
- talloc_free(ret);
- return NULL;
+ return ret;
}
diff --git a/source4/nbt_server/wins/winsdb.c b/source4/nbt_server/wins/winsdb.c
index 4cdcd592fc..a037f9cc49 100644
--- a/source4/nbt_server/wins/winsdb.c
+++ b/source4/nbt_server/wins/winsdb.c
@@ -350,21 +350,16 @@ size_t winsdb_addr_list_length(struct winsdb_addr **addresses)
const char **winsdb_addr_string_list(TALLOC_CTX *mem_ctx, struct winsdb_addr **addresses)
{
size_t len = winsdb_addr_list_length(addresses);
- const char **str_list;
+ const char **str_list=NULL;
size_t i;
- str_list = talloc_array(mem_ctx, const char *, len + 1);
- if (!str_list) return NULL;
-
for (i=0; i < len; i++) {
- str_list[i] = talloc_strdup(str_list, addresses[i]->address);
+ str_list = str_list_add(str_list, addresses[i]->address);
if (!str_list[i]) {
- talloc_free(str_list);
return NULL;
}
}
-
- str_list[len] = NULL;
+ talloc_steal(mem_ctx, str_list);
return str_list;
}
diff --git a/source4/nbt_server/wins/winsserver.c b/source4/nbt_server/wins/winsserver.c
index 78bf0bd141..44842c7542 100644
--- a/source4/nbt_server/wins/winsserver.c
+++ b/source4/nbt_server/wins/winsserver.c
@@ -370,6 +370,14 @@ static void nbtd_winsserver_query(struct nbt_name_socket *nbtsock,
if (!addresses) {
goto notfound;
}
+
+ /* if the query didn't come from loopback, then never give out
+ loopback in the reply, as loopback means something
+ different for the recipient than for us */
+ if (strcmp(src->addr, "127.0.0.1") != 0) {
+ str_list_remove(addresses, "127.0.0.1");
+ }
+
found:
nbtd_name_query_reply(nbtsock, packet, src, name,
0, nb_flags, addresses);