mirror of
https://github.com/samba-team/samba.git
synced 2025-02-02 09:47:23 +03:00
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@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
This commit is contained in:
parent
57053c5cb9
commit
b7eb725292
@ -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,
|
||||
|
@ -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) {
|
||||
status = smbXsrv_session_add_channel(session, conn, &channel);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
TALLOC_FREE(session);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
return status;
|
||||
}
|
||||
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) {
|
||||
TALLOC_FREE(session);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user