*/
#include "includes.h"
+#include "lib/util/util_file.h"
#include "lib/util/util_net.h"
#include "system/filesys.h"
#include "system/network.h"
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.
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",
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;
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;