[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Thu Jul 16 08:17:02 UTC 2020


The branch, master has been updated
       via  8ea51f4135d s3: libsmb: Cleanup - Make ipstr_list_make() talloc rather than malloc.
       via  1d712add994 s3: libsmb: Cleanup - Move DEBUG -> DBG_XXX() macros.
       via  bd205f2a6cc s3: libsmb: Cleanup - make namecache_status_record_key() use talloc.
       via  56d5cbe8bf6 s3: libsmb: Cleanup - make namecache_key() use talloc.
       via  df0e54bea30 s3: libsmb: Cleanup - namecache_store() - use common out.
       via  06f0a7e911d s3: libsmb: Cleanup - namecache_store() initialize stack variables.
       via  67ea64d27e6 s3: libsmb: Cleanup - move talloc frame out of inner scope.
       via  be41035127d s3: libsmb: Cleanup modern coding standards. 'True/False' -> 'true/false'.
       via  c7e8c3d427d s3: lib: Cleanup - make ipstr_list_make() and ipstr_list_parse() private to the only user.
       via  2371c45f11c s3: lib: Cleanup - nothing uses ipstr_list_free(). Remove it.
       via  527d7df08ee s3: lib: Cleanup - all the ipstr_XXX() functions are only used in namecache.c.
      from  0e287127cb8 ctdb-tools: Improve onnode's ShellCheck credibility

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 8ea51f4135d21f0cf70215521818eeb55e7bdbaa
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Jul 15 15:02:02 2020 -0700

    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 at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>
    
    Autobuild-User(master): Volker Lendecke <vl at samba.org>
    Autobuild-Date(master): Thu Jul 16 08:16:31 UTC 2020 on sn-devel-184

commit 1d712add994f8426a90589788be53c1ce2e54c17
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Jul 15 14:41:45 2020 -0700

    s3: libsmb: Cleanup - Move DEBUG -> DBG_XXX() macros.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit bd205f2a6cc6ca23bab8eb15d57c16994641d711
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Jul 15 14:38:23 2020 -0700

    s3: libsmb: Cleanup - make namecache_status_record_key() use talloc.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 56d5cbe8bf6f4cd65b673b7923f955a457f8e0c7
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Jul 15 13:37:59 2020 -0700

    s3: libsmb: Cleanup - make namecache_key() use talloc.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit df0e54bea307b459433e1fdf9dc547875ee494cc
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Jul 15 13:33:27 2020 -0700

    s3: libsmb: Cleanup - namecache_store() - use common out.
    
    Prepare for moving malloc values to talloc.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 06f0a7e911da4f3279066f5ffaf4e03d01b354af
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Jul 15 13:31:38 2020 -0700

    s3: libsmb: Cleanup - namecache_store() initialize stack variables.
    
    Preparing for common out: exit.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 67ea64d27e6ede6993025e9598162f385d2937f7
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Jul 15 13:28:33 2020 -0700

    s3: libsmb: Cleanup - move talloc frame out of inner scope.
    
    Make it available thoughout the function. Prepare to use
    talloc for namecache_key().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit be41035127d3cc7f8144b10dcbc1894dff4d587f
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Jul 15 12:12:23 2020 -0700

    s3: libsmb: Cleanup modern coding standards. 'True/False' -> 'true/false'.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit c7e8c3d427d39f275588c495c92f3e2eeca2b832
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Jul 15 11:58:45 2020 -0700

    s3: lib: Cleanup - make ipstr_list_make() and ipstr_list_parse() private to the only user.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 2371c45f11c91ef16b02d86cdc6f6d4f7624b356
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Jul 15 11:48:30 2020 -0700

    s3: lib: Cleanup - nothing uses ipstr_list_free(). Remove it.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 527d7df08eef1ab8a3ecbed3e16d4ffcbd93db1c
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Jul 15 11:43:03 2020 -0700

    s3: lib: Cleanup - all the ipstr_XXX() functions are only used in namecache.c.
    
    Move them there. Will remove from the global namespace next.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/include/proto.h    |   5 -
 source3/lib/util_str.c     | 164 ---------------------------
 source3/libsmb/namecache.c | 275 ++++++++++++++++++++++++++++++++++-----------
 3 files changed, 212 insertions(+), 232 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index 12aa392abae..d349e22aa6b 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -631,11 +631,6 @@ size_t strlen_m_term(const char *s);
 size_t strlen_m_term_null(const char *s);
 int fstr_sprintf(fstring s, const char *fmt, ...);
 
-char *ipstr_list_make(char **ipstr_list,
-			const struct ip_service *ip_list,
-			int ip_count);
-int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list);
-void ipstr_list_free(char* ipstr_list);
 uint64_t STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr);
 uint64_t conv_str_size(const char * str);
 int asprintf_strupper_m(char **strp, const char *fmt, ...)
diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c
index c62cbe16a59..c31667c8821 100644
--- a/source3/lib/util_str.c
+++ b/source3/lib/util_str.c
@@ -560,170 +560,6 @@ int fstr_sprintf(fstring s, const char *fmt, ...)
 	return ret;
 }
 
-#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 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
- **/
-
-char *ipstr_list_make(char **ipstr_list,
-			const struct ip_service *ip_list,
-			int ip_count)
-{
-	int i;
-
-	/* arguments checking */
-	if (!ip_list || !ipstr_list) {
-		return 0;
-	}
-
-	*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]);
-	}
-
-	return (*ipstr_list);
-}
-
-
-/**
- * Parse given ip string list into array of ip addresses
- * (as ip_service structures)
- *    e.g. [IPv6]:port,192.168.1.100:389,192.168.1.78, ...
- *
- * @param ipstr ip string list to be parsed
- * @param ip_list pointer to array of ip addresses which is
- *        allocated by this function and must be freed by caller
- * @return number of successfully parsed addresses
- **/
-
-int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
-{
-	TALLOC_CTX *frame;
-	char *token_str = NULL;
-	size_t i, count;
-
-	if (!ipstr_list || !ip_list)
-		return 0;
-
-	count = count_chars(ipstr_list, IPSTR_LIST_CHAR) + 1;
-	if ( (*ip_list = SMB_MALLOC_ARRAY(struct ip_service, count)) == NULL ) {
-		DEBUG(0,("ipstr_list_parse: malloc failed for %lu entries\n",
-					(unsigned long)count));
-		return 0;
-	}
-
-	frame = talloc_stackframe();
-	for ( i=0; next_token_talloc(frame, &ipstr_list, &token_str,
-				IPSTR_LIST_SEP) && i<count; i++ ) {
-		char *s = token_str;
-		char *p = strrchr(token_str, ':');
-
-		if (p) {
-			*p = 0;
-			(*ip_list)[i].port = atoi(p+1);
-		}
-
-		/* convert single token to ip address */
-		if (token_str[0] == '[') {
-			/* IPv6 address. */
-			s++;
-			p = strchr(token_str, ']');
-			if (!p) {
-				continue;
-			}
-			*p = '\0';
-		}
-		if (!interpret_string_addr(&(*ip_list)[i].ss,
-					s,
-					AI_NUMERICHOST)) {
-			continue;
-		}
-	}
-	TALLOC_FREE(frame);
-	return count;
-}
-
-/**
- * Safely free ip string list
- *
- * @param ipstr_list ip string list to be freed
- **/
-
-void ipstr_list_free(char* ipstr_list)
-{
-	SAFE_FREE(ipstr_list);
-}
-
 /* read a SMB_BIG_UINT from a string */
 uint64_t STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr)
 {
diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
index 082f256bc02..7f534587263 100644
--- a/source3/libsmb/namecache.c
+++ b/source3/libsmb/namecache.c
@@ -24,6 +24,147 @@
 #include "includes.h"
 #include "lib/gencache.h"
 
+#define IPSTR_LIST_SEP	","
+#define IPSTR_LIST_CHAR	','
+
+/**
+ * Allocate and initialise an ipstr list using ip adresses
+ * passed as arguments.
+ *
+ * @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(TALLOC_CTX *ctx,
+			const struct ip_service *ip_list,
+			int ip_count)
+{
+	char *ipstr_list = NULL;
+	int i;
+
+	/* arguments checking */
+	if (ip_list == NULL) {
+		return NULL;
+	}
+
+	/* process ip addresses given as arguments */
+	for (i = 0; i < ip_count; 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;
+}
+
+/**
+ * Parse given ip string list into array of ip addresses
+ * (as ip_service structures)
+ *    e.g. [IPv6]:port,192.168.1.100:389,192.168.1.78, ...
+ *
+ * @param ipstr ip string list to be parsed
+ * @param ip_list pointer to array of ip addresses which is
+ *        allocated by this function and must be freed by caller
+ * @return number of successfully parsed addresses
+ **/
+
+static int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
+{
+	TALLOC_CTX *frame;
+	char *token_str = NULL;
+	size_t i, count;
+
+	if (!ipstr_list || !ip_list)
+		return 0;
+
+	count = count_chars(ipstr_list, IPSTR_LIST_CHAR) + 1;
+	if ( (*ip_list = SMB_MALLOC_ARRAY(struct ip_service, count)) == NULL ) {
+		DBG_ERR("malloc failed for %lu entries\n",
+					(unsigned long)count);
+		return 0;
+	}
+
+	frame = talloc_stackframe();
+	for ( i=0; next_token_talloc(frame, &ipstr_list, &token_str,
+				IPSTR_LIST_SEP) && i<count; i++ ) {
+		char *s = token_str;
+		char *p = strrchr(token_str, ':');
+
+		if (p) {
+			*p = 0;
+			(*ip_list)[i].port = atoi(p+1);
+		}
+
+		/* convert single token to ip address */
+		if (token_str[0] == '[') {
+			/* IPv6 address. */
+			s++;
+			p = strchr(token_str, ']');
+			if (!p) {
+				continue;
+			}
+			*p = '\0';
+		}
+		if (!interpret_string_addr(&(*ip_list)[i].ss,
+					s,
+					AI_NUMERICHOST)) {
+			continue;
+		}
+	}
+	TALLOC_FREE(frame);
+	return count;
+}
+
 #define NBTKEY_FMT  "NBT/%s#%02X"
 
 /**
@@ -38,13 +179,14 @@
  *         type number
  */
 
-static char *namecache_key(const char *name,
-				int name_type)
+static char *namecache_key(TALLOC_CTX *ctx,
+			   const char *name,
+			   int name_type)
 {
-	char *keystr = NULL;
-	asprintf_strupper_m(&keystr, NBTKEY_FMT, name, name_type);
-
-	return keystr;
+	return talloc_asprintf_strupper_m(ctx,
+					  NBTKEY_FMT,
+					  name,
+					  name_type);
 }
 
 /**
@@ -63,23 +205,25 @@ bool namecache_store(const char *name,
 			struct ip_service *ip_list)
 {
 	time_t expiry;
-	char *key, *value_string;
+	char *key = NULL;
+	char *value_string = NULL;
 	int i;
-	bool ret;
+	bool ret = false;
+	TALLOC_CTX *frame = talloc_stackframe();
 
 	if (name_type > 255) {
-		return False; /* Don't store non-real name types. */
+		/* Don't store non-real name types. */
+		goto out;
 	}
 
 	if ( DEBUGLEVEL >= 5 ) {
-		TALLOC_CTX *ctx = talloc_stackframe();
 		char *addr = NULL;
 
-		DEBUG(5, ("namecache_store: storing %d address%s for %s#%02x: ",
-			num_names, num_names == 1 ? "": "es", name, name_type));
+		DBG_INFO("storing %d address%s for %s#%02x: ",
+			num_names, num_names == 1 ? "": "es", name, name_type);
 
 		for (i = 0; i < num_names; i++) {
-			addr = print_canonical_sockaddr(ctx,
+			addr = print_canonical_sockaddr(frame,
 							&ip_list[i].ss);
 			if (!addr) {
 				continue;
@@ -89,31 +233,31 @@ bool namecache_store(const char *name,
 
 		}
 		DEBUGADD(5, ("\n"));
-		TALLOC_FREE(ctx);
 	}
 
-	key = namecache_key(name, name_type);
+	key = namecache_key(frame, name, name_type);
 	if (!key) {
-		return False;
+		goto out;
 	}
 
 	expiry = time(NULL) + lp_name_cache_timeout();
 
 	/*
 	 * 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)) {
-		SAFE_FREE(key);
-		SAFE_FREE(value_string);
-		return false;
+	value_string = ipstr_list_make(frame, ip_list, num_names);
+	if (value_string == NULL) {
+		goto out;
 	}
 
 	/* set the entry */
 	ret = gencache_set(key, value_string, expiry);
-	SAFE_FREE(key);
-	SAFE_FREE(value_string);
+
+  out:
+
+	TALLOC_FREE(key);
+	TALLOC_FREE(value_string);
+	TALLOC_FREE(frame);
 	return ret;
 }
 
@@ -140,11 +284,11 @@ bool namecache_fetch(const char *name,
 
 	/* exit now if null pointers were passed as they're required further */
 	if (!ip_list || !num_names) {
-		return False;
+		return false;
 	}
 
 	if (name_type > 255) {
-		return False; /* Don't fetch non-real name types. */
+		return false; /* Don't fetch non-real name types. */
 	}
 
 	*num_names = 0;
@@ -152,25 +296,25 @@ bool namecache_fetch(const char *name,
 	/*
 	 * Use gencache interface - lookup the key
 	 */
-	key = namecache_key(name, name_type);
+	key = namecache_key(talloc_tos(), name, name_type);
 	if (!key) {
-		return False;
+		return false;
 	}
 
 	if (!gencache_get(key, talloc_tos(), &value, &timeout)) {
-		DEBUG(5, ("no entry for %s#%02X found.\n", name, name_type));
-		SAFE_FREE(key);
-		return False;
+		DBG_INFO("no entry for %s#%02X found.\n", name, name_type);
+		TALLOC_FREE(key);
+		return false;
 	}
 
-	DEBUG(5, ("name %s#%02X found.\n", name, name_type));
+	DBG_INFO("name %s#%02X found.\n", name, name_type);
 
 	/*
 	 * Split up the stored value into the list of IP adresses
 	 */
 	*num_names = ipstr_list_parse(value, ip_list);
 
-	SAFE_FREE(key);
+	TALLOC_FREE(key);
 	TALLOC_FREE(value);
 
 	return *num_names > 0; /* true only if some ip has been fetched */
@@ -187,15 +331,15 @@ bool namecache_delete(const char *name, int name_type)
 	char *key;
 
 	if (name_type > 255) {
-		return False; /* Don't fetch non-real name types. */
+		return false; /* Don't fetch non-real name types. */
 	}
 
-	key = namecache_key(name, name_type);
+	key = namecache_key(talloc_tos(), name, name_type);
 	if (!key) {
-		return False;
+		return false;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list