[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