From e065fc8e2840ec7af07228641b89fb772f96ca9d Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 26 Aug 2020 13:59:14 -0700 Subject: [PATCH] s3: libsmb: Move talloc_stackframe() initialization to the front of _internal_resolve_name(). Ensure we free correctly on all exit paths. This will allow us to move the internal calls to talloc more easily. Signed-off-by: Jeremy Allison Reviewed-by: Noel Power --- source3/libsmb/namequery.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index cc513809583..fe4dd2774b1 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -3189,7 +3189,7 @@ static NTSTATUS _internal_resolve_name(const char *name, int i; bool ok; struct sockaddr_storage *ss_list = NULL; - TALLOC_CTX *frame = NULL; + TALLOC_CTX *frame = talloc_stackframe(); *return_iplist = NULL; *return_count = 0; @@ -3201,6 +3201,7 @@ static NTSTATUS _internal_resolve_name(const char *name, *return_iplist = SMB_MALLOC_P(struct ip_service); if (*return_iplist == NULL) { DBG_ERR("malloc fail !\n"); + TALLOC_FREE(frame); return NT_STATUS_NO_MEMORY; } @@ -3214,13 +3215,16 @@ static NTSTATUS _internal_resolve_name(const char *name, DBG_WARNING("interpret_string_addr failed on %s\n", name); SAFE_FREE(*return_iplist); + TALLOC_FREE(frame); return NT_STATUS_INVALID_PARAMETER; } if (is_zero_addr(&(*return_iplist)->ss)) { SAFE_FREE(*return_iplist); + TALLOC_FREE(frame); return NT_STATUS_UNSUCCESSFUL; } *return_count = 1; + TALLOC_FREE(frame); return NT_STATUS_OK; } @@ -3232,8 +3236,10 @@ static NTSTATUS _internal_resolve_name(const char *name, *return_count ); /* This could be a negative response */ if (*return_count > 0) { + TALLOC_FREE(frame); return NT_STATUS_OK; } else { + TALLOC_FREE(frame); return NT_STATUS_UNSUCCESSFUL; } } @@ -3242,6 +3248,7 @@ static NTSTATUS _internal_resolve_name(const char *name, if (resolve_order && strcmp(resolve_order[0], "NULL") == 0) { DBG_DEBUG("all lookups disabled\n"); + TALLOC_FREE(frame); return NT_STATUS_INVALID_PARAMETER; } @@ -3250,8 +3257,6 @@ static NTSTATUS _internal_resolve_name(const char *name, resolve_order = host_order; } - frame = talloc_stackframe(); - if ((strlen(name) > MAX_NETBIOSNAME_LEN - 1) || (strchr(name, '.') != NULL)) { /* -- 2.47.3