[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Thu Sep 10 19:34:03 UTC 2015


The branch, master has been updated
       via  b7eb725 smbXsrv_session: factor smbXsrv_session_add_channel() out of smbXsrv_session_create()
       via  57053c5 s3:smb2_sesssetup: let smbd_smb2_reauth_generic_return() cope with channels
       via  69d2af1 s3:smb2_sesssetup: let smbd_smb2_auth_generic_return() cope with channels
       via  6f95bc5 s3:smb2_sesssetup: change talloc hierarchy in smbd_smb2_session_setup_gensec_done
      from  cf5c28d replace: Fix check for gettimeofday()

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


- Log -----------------------------------------------------------------
commit b7eb72529261aed822ed649651f8f4132a132e7d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jun 25 16:09:04 2014 +0200

    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>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Thu Sep 10 21:33:47 CEST 2015 on sn-devel-104

commit 57053c5cb9c9296e96918ee8a32c264285d694c1
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jul 29 17:44:37 2015 +0200

    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>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 69d2af10d49733f40c7496dd535abd6e3092b6fa
Author: Michael Adam <obnox at samba.org>
Date:   Wed Jul 29 17:42:55 2015 +0200

    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>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 6f95bc502591bc44cd525a86bd0d97b51f78a8ad
Author: Michael Adam <obnox at samba.org>
Date:   Wed Jul 29 17:07:29 2015 +0200

    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>
    Reviewed-by: Jeremy Allison <jra at samba.org>

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

Summary of changes:
 source3/smbd/globals.h         |  3 ++
 source3/smbd/smb2_sesssetup.c  | 29 +++++++++++----
 source3/smbd/smbXsrv_session.c | 83 +++++++++++++++++++++++++++---------------
 3 files changed, 78 insertions(+), 37 deletions(-)


Changeset truncated at 500 lines:

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/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c
index 7d1aaf5..14249df 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);
 
@@ -439,10 +439,16 @@ 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;
+	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);
 
@@ -487,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;
 
@@ -511,10 +518,16 @@ 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;
+	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);
 
@@ -714,7 +727,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;
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;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list