[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-unstable-240-gd933545

Jeremy Allison jra at samba.org
Thu Nov 8 23:14:37 GMT 2007


The branch, v3-2-test has been updated
       via  d9335456d23271a4b15b97d24f1b263700a3b9df (commit)
       via  48e0725cd6bb976ca799e6b8464c94aeffb1672b (commit)
      from  201800a4c960d4f2afeb6cc760ac303df76d5e36 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit d9335456d23271a4b15b97d24f1b263700a3b9df
Merge: 48e0725cd6bb976ca799e6b8464c94aeffb1672b 201800a4c960d4f2afeb6cc760ac303df76d5e36
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Nov 8 15:13:41 2007 -0800

    Merge branch 'v3-2-test' of ssh://jra@git.samba.org/data/git/samba into v3-2-test

commit 48e0725cd6bb976ca799e6b8464c94aeffb1672b
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Nov 7 12:48:58 2007 -0800

    Unify the name and addr cache for client_name to
    make threading easier ultimately.
    Jeremy.

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

Summary of changes:
 source/lib/util_sock.c |   52 ++++++++++++++++++++++++++++-------------------
 1 files changed, 31 insertions(+), 21 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/lib/util_sock.c b/source/lib/util_sock.c
index 4a870b7..bd6fdbb 100644
--- a/source/lib/util_sock.c
+++ b/source/lib/util_sock.c
@@ -579,7 +579,7 @@ static const char *get_socket_addr(int fd, char *addr_buf, size_t addr_len)
  	 * zero IPv6 address. No good choice here.
  	 */
 
-	safe_strcpy(addr_buf, "0.0.0.0", addr_len-1);
+	strlcpy(addr_buf, "0.0.0.0", addr_len);
 
 	if (fd == -1) {
 		return addr_buf;
@@ -1689,7 +1689,7 @@ static const char *get_peer_addr_internal(int fd,
 	struct sockaddr_storage ss;
 	socklen_t length = sizeof(ss);
 
-	safe_strcpy(addr_buf,"0.0.0.0",addr_buf_len-1);
+	strlcpy(addr_buf,"0.0.0.0",addr_buf_len);
 
 	if (fd == -1) {
 		return addr_buf;
@@ -1785,45 +1785,54 @@ static bool matchname(const char *remotehost,
 	return false;
 }
 
+static struct {
+        struct sockaddr_storage ss;
+        char *name;
+} nc;
+
 /*******************************************************************
  Return the DNS name of the remote end of a socket.
 ******************************************************************/
 
-static char addr_buf_cache[INET6_ADDRSTRLEN];
-
-const char *get_peer_name(int fd, bool force_lookup)
+const char *get_peer_name(int fd,
+				bool force_lookup)
 {
-	static pstring name_buf;
 	char addr_buf[INET6_ADDRSTRLEN];
 	struct sockaddr_storage ss;
 	socklen_t length = sizeof(ss);
 	const char *p;
 	int ret;
-	pstring tmp_name;
+	char name_buf[HOST_NAME_MAX];
+	char tmp_name[HOST_NAME_MAX];
 
 	/* reverse lookups can be *very* expensive, and in many
 	   situations won't work because many networks don't link dhcp
 	   with dns. To avoid the delay we avoid the lookup if
 	   possible */
 	if (!lp_hostname_lookups() && (force_lookup == false)) {
-		pstrcpy(name_buf, get_peer_addr(fd, addr_buf, sizeof(addr_buf)));
-		return name_buf;
+		length = sizeof(nc.ss);
+		p = get_peer_addr_internal(fd, addr_buf, sizeof(addr_buf),
+			&nc.ss, &length);
+		SAFE_FREE(nc.name);
+		nc.name = SMB_STRDUP(p);
+		return nc.name ? nc.name : "UNKNOWN";
 	}
 
+	memset(&ss, '\0', sizeof(ss));
 	p = get_peer_addr_internal(fd, addr_buf, sizeof(addr_buf), &ss, &length);
 
 	/* it might be the same as the last one - save some DNS work */
-	if (strcmp(p, addr_buf_cache) == 0) {
-		return name_buf;
+	if (addr_equal(&ss, &nc.ss)) {
+		return nc.name ? nc.name : "UNKNOWN";
 	}
 
-	pstrcpy(name_buf,"UNKNOWN");
+	/* Not the same. Reset the cache. */
+	zero_addr(&nc.ss);
+	SAFE_FREE(nc.name);
 	if (fd == -1) {
-		return name_buf;
+		return "UNKNOWN";
 	}
 
-	safe_strcpy(addr_buf_cache, p, sizeof(addr_buf_cache)-1);
-
 	/* Look up the remote host name. */
 	ret = getnameinfo((struct sockaddr *)&ss,
 			length,
@@ -1838,11 +1847,11 @@ const char *get_peer_name(int fd, bool force_lookup)
 			"for %s with error %s\n",
 			p,
 			gai_strerror(ret)));
-		pstrcpy(name_buf, p);
+		strlcpy(name_buf, p, sizeof(name_buf));
 	} else {
 		if (!matchname(name_buf, &ss, length)) {
 			DEBUG(0,("Matchname failed on %s %s\n",name_buf,p));
-			pstrcpy(name_buf,"UNKNOWN");
+			strlcpy(name_buf,"UNKNOWN",sizeof(name_buf));
 		}
 	}
 
@@ -1850,13 +1859,14 @@ const char *get_peer_name(int fd, bool force_lookup)
 	   use --enable-developer or the clobber_region() call will
 	   get you */
 
-	pstrcpy(tmp_name, name_buf );
+	strlcpy(tmp_name, name_buf, sizeof(tmp_name));
 	alpha_strcpy(name_buf, tmp_name, "_-.", sizeof(name_buf));
 	if (strstr(name_buf,"..")) {
-		pstrcpy(name_buf, "UNKNOWN");
+		strlcpy(name_buf, "UNKNOWN", sizeof(name_buf));
 	}
 
-	return name_buf;
+	nc.name = SMB_STRDUP(name_buf);
+	return nc.name ? nc.name : "UNKNOWN";
 }
 
 /*******************************************************************
@@ -1934,7 +1944,7 @@ int create_pipe_sock(const char *socket_dir,
 	unlink(path);
 	memset(&sunaddr, 0, sizeof(sunaddr));
 	sunaddr.sun_family = AF_UNIX;
-	safe_strcpy(sunaddr.sun_path, path, sizeof(sunaddr.sun_path)-1);
+	strlcpy(sunaddr.sun_path, path, sizeof(sunaddr.sun_path));
 
 	if (bind(sock, (struct sockaddr *)&sunaddr, sizeof(sunaddr)) == -1) {
 		DEBUG(0, ("bind failed on pipe socket %s: %s\n", path,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list