smbXsrv_session: factor smbXsrv_session_add_channel() out of smbXsrv_session_create()
authorStefan Metzmacher <metze@samba.org>
Wed, 25 Jun 2014 14:09:04 +0000 (16:09 +0200)
committerJeremy Allison <jra@samba.org>
Thu, 10 Sep 2015 19:33:47 +0000 (21:33 +0200)
This allows to create more than one channel.

Pair-Programmed-With: Michael Adam <obnox@samba.org>
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Thu Sep 10 21:33:47 CEST 2015 on sn-devel-104

source3/smbd/globals.h
source3/smbd/smbXsrv_session.c

index e8fb1d548d77a27100c578121c298254f1bba41a..b1070495a0a01a756eab6c203480a0b0d5dfe1d8 100644 (file)
@@ -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,
index 9b2b5214cbb95739e3f2cf6686c4c5d644d1aa8e..9f8520a2725a27a9ade54e5ddcedab6d3d195c1a 100644 (file)
@@ -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;