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 <[email protected]>
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 <[email protected]>
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Thu Sep 10 21:33:47 CEST 2015 on sn-devel-104

commit 57053c5cb9c9296e96918ee8a32c264285d694c1
Author: Stefan Metzmacher <[email protected]>
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 <[email protected]>
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 69d2af10d49733f40c7496dd535abd6e3092b6fa
Author: Michael Adam <[email protected]>
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 <[email protected]>
    Signed-off-by: Michael Adam <[email protected]>
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 6f95bc502591bc44cd525a86bd0d97b51f78a8ad
Author: Michael Adam <[email protected]>
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 <[email protected]>
    Signed-off-by: Michael Adam <[email protected]>
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

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

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

Reply via email to