1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-29 13:49:30 +03:00

s3: libsmb: Cleanup - Make ipstr_list_make() talloc rather than malloc.

Remove the excessive and unneeded ipstr_list_add() function,
fold it into ipstr_list_make() to make it much clearer what
we're doing.

The only use of MALLOC now is in ipstr_list_parse() returned
by namecache_fetch(). We need to fix the caller before
we can move that to talloc. As that is used inside internal_resolve_name()
which is designed to return a MALLOC'ed ip list from all
name resolution mechanisms leave that fix for another day.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>

Autobuild-User(master): Volker Lendecke <vl@samba.org>
Autobuild-Date(master): Thu Jul 16 08:16:31 UTC 2020 on sn-devel-184
This commit is contained in:
Jeremy Allison
2020-07-15 15:02:02 -07:00
committed by Volker Lendecke
parent 1d712add99
commit 8ea51f4135

View File

@ -27,98 +27,86 @@
#define IPSTR_LIST_SEP ","
#define IPSTR_LIST_CHAR ','
/**
* Add ip string representation to ipstr list. Used also
* as part of @function ipstr_list_make
*
* @param ipstr_list pointer to string containing ip list;
* MUST BE already allocated and IS reallocated if necessary
* @param ipstr_size pointer to current size of ipstr_list (might be changed
* as a result of reallocation)
* @param ip IP address which is to be added to list
* @return pointer to string appended with new ip and possibly
* reallocated to new length
**/
static char *ipstr_list_add(char **ipstr_list, const struct ip_service *service)
{
char *new_ipstr = NULL;
char addr_buf[INET6_ADDRSTRLEN];
int ret;
/* arguments checking */
if (!ipstr_list || !service) {
return NULL;
}
print_sockaddr(addr_buf,
sizeof(addr_buf),
&service->ss);
/* attempt to convert ip to a string and append colon separator to it */
if (*ipstr_list) {
if (service->ss.ss_family == AF_INET) {
/* IPv4 */
ret = asprintf(&new_ipstr, "%s%s%s:%d", *ipstr_list,
IPSTR_LIST_SEP, addr_buf,
service->port);
} else {
/* IPv6 */
ret = asprintf(&new_ipstr, "%s%s[%s]:%d", *ipstr_list,
IPSTR_LIST_SEP, addr_buf,
service->port);
}
SAFE_FREE(*ipstr_list);
} else {
if (service->ss.ss_family == AF_INET) {
/* IPv4 */
ret = asprintf(&new_ipstr, "%s:%d", addr_buf,
service->port);
} else {
/* IPv6 */
ret = asprintf(&new_ipstr, "[%s]:%d", addr_buf,
service->port);
}
}
if (ret == -1) {
return NULL;
}
*ipstr_list = new_ipstr;
return *ipstr_list;
}
/**
* Allocate and initialise an ipstr list using ip adresses
* passed as arguments.
*
* @param ipstr_list pointer to string meant to be allocated and set
* @param ctx TALLOC_CTX to use
* @param ip_list array of ip addresses to place in the list
* @param ip_count number of addresses stored in ip_list
* @return pointer to allocated ip string
**/
static char *ipstr_list_make(char **ipstr_list,
static char *ipstr_list_make(TALLOC_CTX *ctx,
const struct ip_service *ip_list,
int ip_count)
{
char *ipstr_list = NULL;
int i;
/* arguments checking */
if (!ip_list || !ipstr_list) {
return 0;
if (ip_list == NULL) {
return NULL;
}
*ipstr_list = NULL;
/* process ip addresses given as arguments */
for (i = 0; i < ip_count; i++) {
*ipstr_list = ipstr_list_add(ipstr_list, &ip_list[i]);
char addr_buf[INET6_ADDRSTRLEN];
char *new_str = NULL;
print_sockaddr(addr_buf,
sizeof(addr_buf),
&ip_list[i].ss);
if (ip_list->ss.ss_family == AF_INET) {
/* IPv4 */
new_str = talloc_asprintf(ctx,
"%s:%d",
addr_buf,
ip_list[i].port);
} else {
/* IPv6 */
new_str = talloc_asprintf(ctx,
"[%s]:%d",
addr_buf,
ip_list[i].port);
}
if (new_str == NULL) {
TALLOC_FREE(ipstr_list);
return NULL;
}
if (ipstr_list == NULL) {
/* First ip address. */
ipstr_list = new_str;
} else {
/*
* Append the separator "," and then the new
* ip address to the existing list.
*
* The efficiency here is horrible, but
* ip_count should be small enough we can
* live with it.
*/
char *tmp = talloc_asprintf(ctx,
"%s%s%s",
ipstr_list,
IPSTR_LIST_SEP,
new_str);
if (tmp == NULL) {
TALLOC_FREE(new_str);
TALLOC_FREE(ipstr_list);
return NULL;
}
TALLOC_FREE(new_str);
TALLOC_FREE(ipstr_list);
ipstr_list = tmp;
}
}
return (*ipstr_list);
return ipstr_list;
}
/**
* Parse given ip string list into array of ip addresses
* (as ip_service structures)
@ -256,10 +244,9 @@ bool namecache_store(const char *name,
/*
* Generate string representation of ip addresses list
* First, store the number of ip addresses and then
* place each single ip
*/
if (!ipstr_list_make(&value_string, ip_list, num_names)) {
value_string = ipstr_list_make(frame, ip_list, num_names);
if (value_string == NULL) {
goto out;
}
@ -269,7 +256,7 @@ bool namecache_store(const char *name,
out:
TALLOC_FREE(key);
SAFE_FREE(value_string);
TALLOC_FREE(value_string);
TALLOC_FREE(frame);
return ret;
}