[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Thu Dec 24 10:54:09 MST 2009


The branch, master has been updated
       via  5126b52... s4:kdc: use the remote and local address from the stream_connection struct
       via  500f55c... s4:smbd: hold tsocket_addresses on the stream_connection
       via  4e2da42... s4:smb_server: fix mixing socket_address and tsocket_address
       via  d3ee0f0... s4:lib/socket: add socket_get_{remote|local}_addr() to get a tsocket_address instead of a socket_address
       via  445baf5... s4:lib/socket: add helpers functions to convert between socket_address and tsocket_address
       via  17c804a... tsocket: only copy the specific part of sockaddr*
       via  4784c8c... tsocket: allow AF_UNIX sockaddrs smaller than sizeof(sockaddr_un)
      from  9620791... s3: Remove unused delete_negative_conn_cache()

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


- Log -----------------------------------------------------------------
commit 5126b52810628bb8d37a7d7768beb18771c4330f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Dec 23 11:16:32 2009 +0100

    s4:kdc: use the remote and local address from the stream_connection struct
    
    metze

commit 500f55ca92efe0235758b131a33bc1645c0545ac
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Dec 23 11:48:06 2009 +0100

    s4:smbd: hold tsocket_addresses on the stream_connection
    
    metze

commit 4e2da423de260468f0457410b0556088f00420d4
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Dec 23 10:19:43 2009 +0100

    s4:smb_server: fix mixing socket_address and tsocket_address
    
    metze

commit d3ee0f021b7670404fdcb6171957dbf06ddf0651
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Dec 23 10:43:05 2009 +0100

    s4:lib/socket: add socket_get_{remote|local}_addr() to get a tsocket_address instead of a socket_address
    
    metze

commit 445baf53a9c0c65dafd8558c2b3ec877c3c5fdc8
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Dec 23 09:38:21 2009 +0100

    s4:lib/socket: add helpers functions to convert between socket_address and tsocket_address
    
    metze

commit 17c804a67593cdb4d8646b5be6b50fddf56b3e27
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Dec 23 19:34:32 2009 +0100

    tsocket: only copy the specific part of sockaddr*
    
    This makes sure we fill the unspefic bytes with 0
    and have zero termination for sockaddr_un.
    
    metze

commit 4784c8c3bea98592486ca973d57c99671eb68cb2
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Dec 23 19:31:41 2009 +0100

    tsocket: allow AF_UNIX sockaddrs smaller than sizeof(sockaddr_un)
    
    This is needed as getpeername() truncates the length to 2 if the
    peer socket has no name.
    
    metze

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

Summary of changes:
 lib/tsocket/tsocket_bsd.c          |   12 ++++-
 source4/kdc/kdc.c                  |   43 +--------------------
 source4/lib/socket/config.mk       |    2 +-
 source4/lib/socket/socket.c        |   72 ++++++++++++++++++++++++++++++++++++
 source4/lib/socket/socket.h        |    7 +++
 source4/smb_server/smb/sesssetup.c |   15 ++++---
 source4/smbd/config.mk             |    2 +-
 source4/smbd/service_stream.c      |   32 +++++++++++----
 source4/smbd/service_stream.h      |    3 +
 9 files changed, 127 insertions(+), 61 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/tsocket/tsocket_bsd.c b/lib/tsocket/tsocket_bsd.c
index 1c1e580..7c02557 100644
--- a/lib/tsocket/tsocket_bsd.c
+++ b/lib/tsocket/tsocket_bsd.c
@@ -210,11 +210,15 @@ int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
 	struct tsocket_address *addr;
 	struct tsocket_address_bsd *bsda;
 
+	if (sa_socklen < sizeof(sa->sa_family)) {
+		errno = EINVAL;
+		return -1;
+	}
+
 	switch (sa->sa_family) {
 	case AF_UNIX:
-		if (sa_socklen < sizeof(struct sockaddr_un)) {
-			errno = EINVAL;
-			return -1;
+		if (sa_socklen > sizeof(struct sockaddr_un)) {
+			sa_socklen = sizeof(struct sockaddr_un);
 		}
 		break;
 	case AF_INET:
@@ -222,6 +226,7 @@ int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
 			errno = EINVAL;
 			return -1;
 		}
+		sa_socklen = sizeof(struct sockaddr_in);
 		break;
 #ifdef HAVE_IPV6
 	case AF_INET6:
@@ -229,6 +234,7 @@ int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
 			errno = EINVAL;
 			return -1;
 		}
+		sa_socklen = sizeof(struct sockaddr_in6);
 		break;
 #endif
 	default:
diff --git a/source4/kdc/kdc.c b/source4/kdc/kdc.c
index b292184..93f1c7d 100644
--- a/source4/kdc/kdc.c
+++ b/source4/kdc/kdc.c
@@ -73,9 +73,6 @@ struct kdc_tcp_connection {
 	/* the kdc_server the connection belongs to */
 	struct kdc_socket *kdc_socket;
 
-	struct tsocket_address *local_address;
-	struct tsocket_address *remote_address;
-
 	struct packet_context *packet;
 };
 
@@ -104,8 +101,8 @@ static NTSTATUS kdc_tcp_recv(void *private_data, DATA_BLOB blob)
 					   tmp_ctx,
 					   &input,
 					   &reply,
-					   kdcconn->remote_address,
-					   kdcconn->local_address,
+					   kdcconn->conn->remote_address,
+					   kdcconn->conn->local_address,
 					   0 /* Not datagram */);
 	if (!ret) {
 		talloc_free(tmp_ctx);
@@ -224,9 +221,6 @@ static void kdc_tcp_accept(struct stream_connection *conn)
 {
  	struct kdc_socket *kdc_socket = talloc_get_type(conn->private_data, struct kdc_socket);
 	struct kdc_tcp_connection *kdcconn;
-	struct socket_address *src_addr;
-	struct socket_address *my_addr;
-	int ret;
 
 	kdcconn = talloc_zero(conn, struct kdc_tcp_connection);
 	if (!kdcconn) {
@@ -237,39 +231,6 @@ static void kdc_tcp_accept(struct stream_connection *conn)
 	kdcconn->kdc_socket	= kdc_socket;
 	conn->private_data    = kdcconn;
 
-	src_addr = socket_get_peer_addr(kdcconn->conn->socket, kdcconn);
-	if (!src_addr) {
-		kdc_tcp_terminate_connection(kdcconn, "kdc_tcp_accept: out of memory");
-		return;
-	}
-
-	my_addr = socket_get_my_addr(kdcconn->conn->socket, kdcconn);
-	if (!my_addr) {
-		kdc_tcp_terminate_connection(kdcconn, "kdc_tcp_accept: out of memory");
-		return;
-	}
-
-	ret = tsocket_address_bsd_from_sockaddr(kdcconn,
-						src_addr->sockaddr,
-						src_addr->sockaddrlen,
-						&kdcconn->remote_address);
-	if (ret < 0) {
-		kdc_tcp_terminate_connection(kdcconn, "kdc_tcp_accept: out of memory");
-		return;
-	}
-
-	ret = tsocket_address_bsd_from_sockaddr(kdcconn,
-						my_addr->sockaddr,
-						my_addr->sockaddrlen,
-						&kdcconn->local_address);
-	if (ret < 0) {
-		kdc_tcp_terminate_connection(kdcconn, "kdc_tcp_accept: out of memory");
-		return;
-	}
-
-	TALLOC_FREE(src_addr);
-	TALLOC_FREE(my_addr);
-
 	kdcconn->packet = packet_init(kdcconn);
 	if (kdcconn->packet == NULL) {
 		kdc_tcp_terminate_connection(kdcconn, "kdc_tcp_accept: out of memory");
diff --git a/source4/lib/socket/config.mk b/source4/lib/socket/config.mk
index ac515c8..07491e1 100644
--- a/source4/lib/socket/config.mk
+++ b/source4/lib/socket/config.mk
@@ -34,7 +34,7 @@ socket_unix_OBJ_FILES = $(libsocketsrcdir)/socket_unix.o
 ################################################
 # Start SUBSYSTEM SOCKET
 [SUBSYSTEM::samba_socket]
-PUBLIC_DEPENDENCIES = LIBTALLOC
+PUBLIC_DEPENDENCIES = LIBTALLOC LIBTSOCKET
 PRIVATE_DEPENDENCIES = SOCKET_WRAPPER LIBCLI_COMPOSITE LIBCLI_RESOLVE
 # End SUBSYSTEM SOCKET
 ################################################
diff --git a/source4/lib/socket/socket.c b/source4/lib/socket/socket.c
index 8e2f168..30db03f 100644
--- a/source4/lib/socket/socket.c
+++ b/source4/lib/socket/socket.c
@@ -24,6 +24,7 @@
 #include "system/filesys.h"
 #include "system/network.h"
 #include "param/param.h"
+#include "../lib/tsocket/tsocket.h"
 
 /*
   auto-close sockets on free
@@ -344,6 +345,77 @@ _PUBLIC_ struct socket_address *socket_get_my_addr(struct socket_context *sock,
 	return sock->ops->fn_get_my_addr(sock, mem_ctx);
 }
 
+_PUBLIC_ struct tsocket_address *socket_address_to_tsocket_address(TALLOC_CTX *mem_ctx,
+								   const struct socket_address *a)
+{
+	struct tsocket_address *r;
+	int ret;
+
+	if (a->sockaddr) {
+		ret = tsocket_address_bsd_from_sockaddr(mem_ctx,
+							a->sockaddr,
+							a->sockaddrlen,
+							&r);
+	} else {
+		ret = tsocket_address_inet_from_strings(mem_ctx,
+							a->family,
+							a->addr,
+							a->port,
+							&r);
+	}
+
+	if (ret != 0) {
+		return NULL;
+	}
+
+	return r;
+}
+
+_PUBLIC_ struct socket_address *tsocket_address_to_socket_address(TALLOC_CTX *mem_ctx,
+								  const struct tsocket_address *a)
+{
+	ssize_t ret;
+	struct sockaddr_storage ss;
+	size_t sslen = sizeof(ss);
+
+	ret = tsocket_address_bsd_sockaddr(a, (struct sockaddr *)(void *)&ss, sslen);
+	if (ret < 0) {
+		return NULL;
+	}
+
+	return socket_address_from_sockaddr(mem_ctx, (struct sockaddr *)(void *)&ss, ret);
+}
+
+_PUBLIC_ struct tsocket_address *socket_get_remote_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx)
+{
+	struct socket_address *a;
+	struct tsocket_address *r;
+
+	a = socket_get_peer_addr(sock, mem_ctx);
+	if (a == NULL) {
+		return NULL;
+	}
+
+	r = socket_address_to_tsocket_address(mem_ctx, a);
+	talloc_free(a);
+	return r;
+}
+
+_PUBLIC_ struct tsocket_address *socket_get_local_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx)
+{
+	struct socket_address *a;
+	struct tsocket_address *r;
+
+	a = socket_get_my_addr(sock, mem_ctx);
+	if (a == NULL) {
+		return NULL;
+	}
+
+	r = socket_address_to_tsocket_address(mem_ctx, a);
+	talloc_free(a);
+	return r;
+}
+
 _PUBLIC_ int socket_get_fd(struct socket_context *sock)
 {
 	if (!sock->ops->fn_get_fd) {
diff --git a/source4/lib/socket/socket.h b/source4/lib/socket/socket.h
index 0287245..8f8922b 100644
--- a/source4/lib/socket/socket.h
+++ b/source4/lib/socket/socket.h
@@ -127,6 +127,7 @@ struct socket_context {
 };
 
 struct resolve_context;
+struct tsocket_address;
 
 /* prototypes */
 NTSTATUS socket_create_with_ops(TALLOC_CTX *mem_ctx, const struct socket_ops *ops,
@@ -158,6 +159,12 @@ NTSTATUS socket_set_option(struct socket_context *sock, const char *option, cons
 char *socket_get_peer_name(struct socket_context *sock, TALLOC_CTX *mem_ctx);
 struct socket_address *socket_get_peer_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx);
 struct socket_address *socket_get_my_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx);
+struct tsocket_address *socket_address_to_tsocket_address(TALLOC_CTX *mem_ctx,
+							  const struct socket_address *a);
+struct socket_address *tsocket_address_to_socket_address(TALLOC_CTX *mem_ctx,
+							 const struct tsocket_address *a);
+struct tsocket_address *socket_get_remote_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx);
+struct tsocket_address *socket_get_local_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx);
 int socket_get_fd(struct socket_context *sock);
 NTSTATUS socket_dup(struct socket_context *sock);
 struct socket_address *socket_address_from_strings(TALLOC_CTX *mem_ctx,
diff --git a/source4/smb_server/smb/sesssetup.c b/source4/smb_server/smb/sesssetup.c
index 37f69ab..8cd2edc 100644
--- a/source4/smb_server/smb/sesssetup.c
+++ b/source4/smb_server/smb/sesssetup.c
@@ -29,6 +29,7 @@
 #include "smb_server/smb_server.h"
 #include "smbd/service_stream.h"
 #include "param/param.h"
+#include "../lib/tsocket/tsocket.h"
 
 /*
   setup the OS, Lanman and domain portions of a session setup reply
@@ -100,7 +101,7 @@ failed:
 static void sesssetup_old(struct smbsrv_request *req, union smb_sesssetup *sess)
 {
 	struct auth_usersupplied_info *user_info = NULL;
-	struct socket_address *remote_address;
+	struct tsocket_address *remote_address;
 	const char *remote_machine = NULL;
 
 	sess->old.out.vuid = 0;
@@ -119,11 +120,12 @@ static void sesssetup_old(struct smbsrv_request *req, union smb_sesssetup *sess)
 		remote_machine = req->smb_conn->negotiate.calling_name->name;
 	}
 	
-	remote_address = socket_get_peer_addr(req->smb_conn->connection->socket, req);
+	remote_address = socket_get_remote_addr(req->smb_conn->connection->socket, req);
 	if (!remote_address) goto nomem;
 
 	if (!remote_machine) {
-		remote_machine = remote_address->addr;
+		remote_machine = tsocket_address_inet_addr_string(remote_address, req);
+		if (!remote_machine) goto nomem;
 	}
 
 	user_info = talloc(req, struct auth_usersupplied_info);
@@ -206,7 +208,7 @@ static void sesssetup_nt1(struct smbsrv_request *req, union smb_sesssetup *sess)
 	NTSTATUS status;
 	struct auth_context *auth_context;
 	struct auth_usersupplied_info *user_info = NULL;
-	struct socket_address *remote_address;
+	struct tsocket_address *remote_address;
 	const char *remote_machine = NULL;
 	
 	sess->nt1.out.vuid = 0;
@@ -245,11 +247,12 @@ static void sesssetup_nt1(struct smbsrv_request *req, union smb_sesssetup *sess)
 		remote_machine = req->smb_conn->negotiate.calling_name->name;
 	}
 
-	remote_address = socket_get_peer_addr(req->smb_conn->connection->socket, req);
+	remote_address = socket_get_remote_addr(req->smb_conn->connection->socket, req);
 	if (!remote_address) goto nomem;
 
 	if (!remote_machine) {
-		remote_machine = remote_address->addr;
+		remote_machine = tsocket_address_inet_addr_string(remote_address, req);
+		if (!remote_machine) goto nomem;
 	}
 
 	user_info = talloc(req, struct auth_usersupplied_info);
diff --git a/source4/smbd/config.mk b/source4/smbd/config.mk
index b85beb0..a77a186 100644
--- a/source4/smbd/config.mk
+++ b/source4/smbd/config.mk
@@ -4,7 +4,7 @@
 PRIVATE_DEPENDENCIES = \
 		LIBTEVENT MESSAGING samba_socket \
 		NDR_NAMED_PIPE_AUTH NAMED_PIPE_AUTH_TSTREAM \
-		HEIMDAL_GSSAPI CREDENTIALS
+		HEIMDAL_GSSAPI CREDENTIALS LIBTSOCKET
 
 service_OBJ_FILES = $(addprefix $(smbdsrcdir)/, \
 		service.o \
diff --git a/source4/smbd/service_stream.c b/source4/smbd/service_stream.c
index ab35eb0..2d8b955 100644
--- a/source4/smbd/service_stream.c
+++ b/source4/smbd/service_stream.c
@@ -26,6 +26,7 @@
 #include "lib/messaging/irpc.h"
 #include "cluster/cluster.h"
 #include "param/param.h"
+#include "../lib/tsocket/tsocket.h"
 
 /* the range of ports to try for dcerpc over tcp endpoints */
 #define SERVER_TCP_LOW_PORT  1024
@@ -164,7 +165,6 @@ static void stream_new_connection(struct tevent_context *ev,
 {
 	struct stream_socket *stream_socket = talloc_get_type(private_data, struct stream_socket);
 	struct stream_connection *srv_conn;
-	struct socket_address *c, *s;
 
 	srv_conn = talloc_zero(ev, struct stream_connection);
 	if (!srv_conn) {
@@ -205,20 +205,34 @@ static void stream_new_connection(struct tevent_context *ev,
 		return;
 	}
 
-	c = socket_get_peer_addr(sock, ev);
-	s = socket_get_my_addr(sock, ev);
-	if (s && c) {
+	srv_conn->remote_address = socket_get_remote_addr(srv_conn->socket, srv_conn);
+	if (!srv_conn->remote_address) {
+		stream_terminate_connection(srv_conn, "socket_get_remote_addr() failed");
+		return;
+	}
+
+	srv_conn->local_address = socket_get_local_addr(srv_conn->socket, srv_conn);
+	if (!srv_conn->local_address) {
+		stream_terminate_connection(srv_conn, "socket_get_local_addr() failed");
+		return;
+	}
+
+	{
+		TALLOC_CTX *tmp_ctx;
 		const char *title;
-		title = talloc_asprintf(s, "conn[%s] c[%s:%u] s[%s:%u] server_id[%s]",
+
+		tmp_ctx = talloc_new(srv_conn);
+
+		title = talloc_asprintf(tmp_ctx, "conn[%s] c[%s] s[%s] server_id[%s]",
 					stream_socket->ops->name, 
-					c->addr, c->port, s->addr, s->port,
-					cluster_id_string(s, server_id));
+					tsocket_address_string(srv_conn->remote_address, tmp_ctx),
+					tsocket_address_string(srv_conn->local_address, tmp_ctx),
+					cluster_id_string(tmp_ctx, server_id));
 		if (title) {
 			stream_connection_set_title(srv_conn, title);
 		}
+		talloc_free(tmp_ctx);
 	}
-	talloc_free(c);
-	talloc_free(s);
 
 	/* we're now ready to start receiving events on this stream */
 	TEVENT_FD_READABLE(srv_conn->event.fde);
diff --git a/source4/smbd/service_stream.h b/source4/smbd/service_stream.h
index 5d577d4..685502a 100644
--- a/source4/smbd/service_stream.h
+++ b/source4/smbd/service_stream.h
@@ -50,6 +50,9 @@ struct stream_connection {
 	struct messaging_context *msg_ctx;
 	struct loadparm_context *lp_ctx;
 
+	struct tsocket_address *local_address;
+	struct tsocket_address *remote_address;
+
 	/*
 	 * this transport layer session info, normally NULL
 	 * which means the same as an anonymous session info


-- 
Samba Shared Repository


More information about the samba-cvs mailing list