lib: Give lib/util/util_file.c its own header file
[samba.git] / libcli / nbt / lmhosts.c
index 722f6adc63db0b9da386b4981aa7060827047b08..ef7229b99bf05836929d2e813e5ee2275bf7f18f 100644 (file)
@@ -22,6 +22,7 @@
 */
 
 #include "includes.h"
+#include "lib/util/util_file.h"
 #include "lib/util/util_net.h"
 #include "system/filesys.h"
 #include "system/network.h"
@@ -159,11 +160,12 @@ void endlmhosts(FILE *fp)
  Resolve via "lmhosts" method.
 *********************************************************/
 
-NTSTATUS resolve_lmhosts_file_as_sockaddr(const char *lmhosts_file, 
-                                         const char *name, int name_type,
-                                         TALLOC_CTX *mem_ctx, 
+NTSTATUS resolve_lmhosts_file_as_sockaddr(TALLOC_CTX *mem_ctx,
+                                         const char *lmhosts_file,
+                                         const char *name,
+                                         int name_type,
                                          struct sockaddr_storage **return_iplist,
-                                         int *return_count)
+                                         size_t *return_count)
 {
        /*
         * "lmhosts" means parse the local lmhosts file.
@@ -175,9 +177,8 @@ NTSTATUS resolve_lmhosts_file_as_sockaddr(const char *lmhosts_file,
        struct sockaddr_storage return_ss;
        NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
        TALLOC_CTX *ctx = NULL;
-
-       *return_iplist = NULL;
-       *return_count = 0;
+       size_t ret_count = 0;
+       struct sockaddr_storage *iplist = NULL;
 
        DEBUG(3,("resolve_lmhosts: "
                "Attempting lmhosts lookup for name %s<0x%x>\n",
@@ -205,20 +206,26 @@ NTSTATUS resolve_lmhosts_file_as_sockaddr(const char *lmhosts_file,
                        TALLOC_FREE(lmhost_name);
                        continue;
                }
-               
-               *return_iplist = talloc_realloc(ctx, (*return_iplist), 
-                                               struct sockaddr_storage,
-                                               (*return_count)+1);
 
-               if ((*return_iplist) == NULL) {
+               /* wrap check. */
+               if (ret_count + 1 < ret_count) {
+                       TALLOC_FREE(ctx);
+                       endlmhosts(fp);
+                       return NT_STATUS_INVALID_PARAMETER;
+               }
+               iplist = talloc_realloc(ctx, iplist,
+                               struct sockaddr_storage,
+                               ret_count+1);
+
+               if (iplist == NULL) {
                        TALLOC_FREE(ctx);
                        endlmhosts(fp);
                        DEBUG(3,("resolve_lmhosts: talloc_realloc fail !\n"));
                        return NT_STATUS_NO_MEMORY;
                }
 
-               (*return_iplist)[*return_count] = return_ss;
-               *return_count += 1;
+               iplist[ret_count] = return_ss;
+               ret_count += 1;
 
                /* we found something */
                status = NT_STATUS_OK;
@@ -228,7 +235,8 @@ NTSTATUS resolve_lmhosts_file_as_sockaddr(const char *lmhosts_file,
                        break;
        }
 
-       talloc_steal(mem_ctx, *return_iplist);
+       *return_count = ret_count;
+       *return_iplist = talloc_move(mem_ctx, &iplist);
        TALLOC_FREE(ctx);
        endlmhosts(fp);
        return status;