r12535: - simplify string list handling in a couple of places using str_list_add()
authorAndrew Tridgell <tridge@samba.org>
Wed, 28 Dec 2005 04:55:53 +0000 (04:55 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:47:53 +0000 (13:47 -0500)
- don't reply with 127.0.0.1 in NBT or WINS name queries unless the
  query came in on the loopback interface. Otherwise clients can end
  up talking to themselves, which is not very productive :-)
(This used to be commit df00f8b3428c6d1254e66275c90ae4025cb52c47)

source4/nbt_server/interfaces.c
source4/nbt_server/wins/winsdb.c
source4/nbt_server/wins/winsserver.c

index f2ccc1c424bb4e9e5daa4aa0abbe7ee99c94fd77..f607c070d86a0baa8e051c4ad04162790374f9f3 100644 (file)
@@ -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;
 }
 
 
index 4cdcd592fca01c13759b0c0f93d3429369bd31bb..a037f9cc497a7c8590f071fbd1f554bd51e889fd 100644 (file)
@@ -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;
 }
 
index 78bf0bd1414c1d7dbd261d6af9b5f9e30f39e580..44842c7542aa56911d0f7856de5b5e0a635384df 100644 (file)
@@ -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);