[PATCHES] some preparations for SMB3 Multi-Channel

Michael Adam obnox at samba.org
Thu Sep 10 08:24:00 UTC 2015


Hi,

attached find a few patches that have percolated through
to the bottom of our multi-channel branches and are now
ready for upstream consumption. :-)

They prepare the session code to handle more than one
channel. Won't change behaviour until binding additional
channels is added. (will come soon..)

Patches carry enough signoff already, but
additional review is appreciated.

Cheers - Michael
-------------- next part --------------
From 37d628c111c8729c5728f5e6c8100fa902aa93b5 Mon Sep 17 00:00:00 2001
From: Michael Adam <obnox at samba.org>
Date: Wed, 29 Jul 2015 17:07:29 +0200
Subject: [PATCH 1/4] s3:smb2_sesssetup: change talloc hierarchy in
 smbd_smb2_session_setup_gensec_done

Only put session_info to the session->global context if we use it.

Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
Signed-off-by: Michael Adam <obnox at samba.org>
Signed-off-by: Stefan Metzmacher <metze at samba.org>
---
 source3/smbd/smb2_sesssetup.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/source3/smbd/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c
index 7d1aaf5..9ba9c76 100644
--- a/source3/smbd/smb2_sesssetup.c
+++ b/source3/smbd/smb2_sesssetup.c
@@ -439,7 +439,8 @@ static NTSTATUS smbd_smb2_auth_generic_return(struct smbXsrv_session *session,
 	reload_services(smb2req->sconn, conn_snum_used, true);
 
 	session->status = NT_STATUS_OK;
-	session->global->auth_session_info = session_info;
+	session->global->auth_session_info = talloc_move(session->global,
+							 &session_info);
 	session->global->auth_session_info_seqnum += 1;
 	session->global->channels[0].auth_session_info_seqnum =
 		session->global->auth_session_info_seqnum;
@@ -511,7 +512,8 @@ static NTSTATUS smbd_smb2_reauth_generic_return(struct smbXsrv_session *session,
 
 	session->status = NT_STATUS_OK;
 	TALLOC_FREE(session->global->auth_session_info);
-	session->global->auth_session_info = session_info;
+	session->global->auth_session_info = talloc_move(session->global,
+							 &session_info);
 	session->global->auth_session_info_seqnum += 1;
 	session->global->channels[0].auth_session_info_seqnum =
 		session->global->auth_session_info_seqnum;
@@ -714,7 +716,7 @@ static void smbd_smb2_session_setup_gensec_done(struct tevent_req *subreq)
 	}
 
 	status = gensec_session_info(state->auth->gensec,
-				     state->session->global,
+				     state,
 				     &state->session_info);
 	if (tevent_req_nterror(req, status)) {
 		return;
-- 
2.4.3


From a38c6e9d17b04ab1d5c9a9b22ed153b940d37a41 Mon Sep 17 00:00:00 2001
From: Michael Adam <obnox at samba.org>
Date: Wed, 29 Jul 2015 17:42:55 +0200
Subject: [PATCH 2/4] s3:smb2_sesssetup: let smbd_smb2_auth_generic_return()
 cope with channels

Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
Signed-off-by: Michael Adam <obnox at samba.org>
Signed-off-by: Stefan Metzmacher <metze at samba.org>
---
 source3/smbd/smb2_sesssetup.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/source3/smbd/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c
index 9ba9c76..2755b79 100644
--- a/source3/smbd/smb2_sesssetup.c
+++ b/source3/smbd/smb2_sesssetup.c
@@ -190,6 +190,7 @@ static NTSTATUS smbd_smb2_auth_generic_return(struct smbXsrv_session *session,
 	struct smbXsrv_session *x = session;
 	struct smbXsrv_session_auth0 *auth = *_auth;
 	struct smbXsrv_connection *xconn = smb2req->xconn;
+	size_t i;
 	struct _derivation {
 		DATA_BLOB label;
 		DATA_BLOB context;
@@ -208,7 +209,6 @@ static NTSTATUS smbd_smb2_auth_generic_return(struct smbXsrv_session *session,
 		struct _derivation *d;
 		DATA_BLOB p;
 		struct hc_sha512state sctx;
-		size_t i;
 
 		preauth = talloc_move(smb2req, &auth->preauth);
 
@@ -442,8 +442,13 @@ static NTSTATUS smbd_smb2_auth_generic_return(struct smbXsrv_session *session,
 	session->global->auth_session_info = talloc_move(session->global,
 							 &session_info);
 	session->global->auth_session_info_seqnum += 1;
-	session->global->channels[0].auth_session_info_seqnum =
-		session->global->auth_session_info_seqnum;
+	for (i=0; i < session->global->num_channels; i++) {
+		struct smbXsrv_channel_global0 *_c =
+			&session->global->channels[i];
+
+		_c->auth_session_info_seqnum =
+			session->global->auth_session_info_seqnum;
+	}
 	session->global->auth_time = timeval_to_nttime(&smb2req->request_time);
 	session->global->expiration_time = gensec_expire_time(auth->gensec);
 
-- 
2.4.3


From 6d4ed424274d381550a3832720f7d3ffd9c4d16d Mon Sep 17 00:00:00 2001
From: Stefan Metzmacher <metze at samba.org>
Date: Wed, 29 Jul 2015 17:44:37 +0200
Subject: [PATCH 3/4] s3:smb2_sesssetup: let smbd_smb2_reauth_generic_return()
 cope with channels

Pair-Programmed-With: Michael Adam <obnox at samba.org>
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Signed-off-by: Michael Adam <obnox at samba.org>
---
 source3/smbd/smb2_sesssetup.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/source3/smbd/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c
index 2755b79..14249df 100644
--- a/source3/smbd/smb2_sesssetup.c
+++ b/source3/smbd/smb2_sesssetup.c
@@ -493,6 +493,7 @@ static NTSTATUS smbd_smb2_reauth_generic_return(struct smbXsrv_session *session,
 	NTSTATUS status;
 	struct smbXsrv_session *x = session;
 	struct smbXsrv_session_auth0 *auth = *_auth;
+	size_t i;
 
 	*_auth = NULL;
 
@@ -520,8 +521,13 @@ static NTSTATUS smbd_smb2_reauth_generic_return(struct smbXsrv_session *session,
 	session->global->auth_session_info = talloc_move(session->global,
 							 &session_info);
 	session->global->auth_session_info_seqnum += 1;
-	session->global->channels[0].auth_session_info_seqnum =
-		session->global->auth_session_info_seqnum;
+	for (i=0; i < session->global->num_channels; i++) {
+		struct smbXsrv_channel_global0 *_c =
+			&session->global->channels[i];
+
+		_c->auth_session_info_seqnum =
+			session->global->auth_session_info_seqnum;
+	}
 	session->global->auth_time = timeval_to_nttime(&smb2req->request_time);
 	session->global->expiration_time = gensec_expire_time(auth->gensec);
 
-- 
2.4.3


From 1b7f44293d031cd4fecb03341593e3f2151cf4c6 Mon Sep 17 00:00:00 2001
From: Stefan Metzmacher <metze at samba.org>
Date: Wed, 25 Jun 2014 16:09:04 +0200
Subject: [PATCH 4/4] smbXsrv_session: factor smbXsrv_session_add_channel() out
 of smbXsrv_session_create()

This allows to create more than one channel.

Pair-Programmed-With: Michael Adam <obnox at samba.org>
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Signed-off-by: Michael Adam <obnox at samba.org>
---
 source3/smbd/globals.h         |  3 ++
 source3/smbd/smbXsrv_session.c | 83 +++++++++++++++++++++++++++---------------
 2 files changed, 57 insertions(+), 29 deletions(-)

diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index e8fb1d5..b107049 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -536,6 +536,9 @@ NTSTATUS smbXsrv_session_global_init(void);
 NTSTATUS smbXsrv_session_create(struct smbXsrv_connection *conn,
 				NTTIME now,
 				struct smbXsrv_session **_session);
+NTSTATUS smbXsrv_session_add_channel(struct smbXsrv_session *session,
+				     struct smbXsrv_connection *conn,
+				     struct smbXsrv_channel_global0 **_c);
 NTSTATUS smbXsrv_session_update(struct smbXsrv_session *session);
 struct smbXsrv_channel_global0;
 NTSTATUS smbXsrv_session_find_channel(const struct smbXsrv_session *session,
diff --git a/source3/smbd/smbXsrv_session.c b/source3/smbd/smbXsrv_session.c
index 9b2b521..9f8520a 100644
--- a/source3/smbd/smbXsrv_session.c
+++ b/source3/smbd/smbXsrv_session.c
@@ -1163,7 +1163,7 @@ NTSTATUS smbXsrv_session_create(struct smbXsrv_connection *conn,
 	void *ptr = NULL;
 	TDB_DATA val;
 	struct smbXsrv_session_global0 *global = NULL;
-	struct smbXsrv_channel_global0 *channels = NULL;
+	struct smbXsrv_channel_global0 *channel = NULL;
 	NTSTATUS status;
 
 	if (table->local.num_sessions >= table->local.max_sessions) {
@@ -1238,36 +1238,11 @@ NTSTATUS smbXsrv_session_create(struct smbXsrv_connection *conn,
 	global->creation_time = now;
 	global->expiration_time = GENSEC_EXPIRE_TIME_INFINITY;
 
-	global->num_channels = 1;
-	channels = talloc_zero_array(global,
-				     struct smbXsrv_channel_global0,
-				     global->num_channels);
-	if (channels == NULL) {
-		TALLOC_FREE(session);
-		return NT_STATUS_NO_MEMORY;
-	}
-	global->channels = channels;
-
-	channels[0].server_id = messaging_server_id(conn->msg_ctx);
-	channels[0].local_address = tsocket_address_string(conn->local_address,
-							   channels);
-	if (channels[0].local_address == NULL) {
-		TALLOC_FREE(session);
-		return NT_STATUS_NO_MEMORY;
-	}
-	channels[0].remote_address = tsocket_address_string(conn->remote_address,
-							    channels);
-	if (channels[0].remote_address == NULL) {
-		TALLOC_FREE(session);
-		return NT_STATUS_NO_MEMORY;
-	}
-	channels[0].remote_name = talloc_strdup(channels, conn->remote_hostname);
-	if (channels[0].remote_name == NULL) {
+	status = smbXsrv_session_add_channel(session, conn, &channel);
+	if (!NT_STATUS_IS_OK(status)) {
 		TALLOC_FREE(session);
-		return NT_STATUS_NO_MEMORY;
+		return status;
 	}
-	channels[0].signing_key = data_blob_null;
-	channels[0].connection = conn;
 
 	ptr = session;
 	val = make_tdb_data((uint8_t const *)&ptr, sizeof(ptr));
@@ -1307,6 +1282,56 @@ NTSTATUS smbXsrv_session_create(struct smbXsrv_connection *conn,
 	return NT_STATUS_OK;
 }
 
+NTSTATUS smbXsrv_session_add_channel(struct smbXsrv_session *session,
+				     struct smbXsrv_connection *conn,
+				     struct smbXsrv_channel_global0 **_c)
+{
+	struct smbXsrv_session_global0 *global = session->global;
+	struct smbXsrv_channel_global0 *c = NULL;
+
+	if (global->num_channels > 31) {
+		/*
+		 * Windows 2012 and 2012R2 allow up to 32 channels
+		 */
+		return NT_STATUS_INSUFFICIENT_RESOURCES;
+	}
+
+	c = talloc_realloc(global,
+			   global->channels,
+			   struct smbXsrv_channel_global0,
+			   global->num_channels + 1);
+	if (c == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+	global->channels = c;
+
+	c = &global->channels[global->num_channels];
+	ZERO_STRUCTP(c);
+
+	c->server_id = messaging_server_id(conn->msg_ctx);
+	c->local_address = tsocket_address_string(conn->local_address,
+						  global->channels);
+	if (c->local_address == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+	c->remote_address = tsocket_address_string(conn->remote_address,
+						   global->channels);
+	if (c->remote_address == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+	c->remote_name = talloc_strdup(global->channels,
+				       conn->remote_hostname);
+	if (c->remote_name == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+	c->connection = conn;
+
+	global->num_channels += 1;
+
+	*_c = c;
+	return NT_STATUS_OK;
+}
+
 NTSTATUS smbXsrv_session_update(struct smbXsrv_session *session)
 {
 	struct smbXsrv_session_table *table = session->table;
-- 
2.4.3

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20150910/7983d3b6/attachment.sig>


More information about the samba-technical mailing list