diff options
-rw-r--r-- | source4/nbt_server/interfaces.c | 35 | ||||
-rw-r--r-- | source4/nbt_server/wins/winsdb.c | 11 | ||||
-rw-r--r-- | source4/nbt_server/wins/winsserver.c | 8 |
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); |