From: Ralph Boehme Date: Wed, 1 Jan 2020 00:06:24 +0000 (+0100) Subject: smbd: introduce smbXsrv_session_info_lookup() X-Git-Tag: ldb-2.1.0~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e80aca04278e6bfd35744ca852549669cee8a8e2;p=thirdparty%2Fsamba.git smbd: introduce smbXsrv_session_info_lookup() Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison --- diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h index 16d1de4c49f..d91d174a776 100644 --- a/source3/smbd/globals.h +++ b/source3/smbd/globals.h @@ -573,6 +573,9 @@ NTSTATUS smb1srv_session_table_init(struct smbXsrv_connection *conn); NTSTATUS smb1srv_session_lookup(struct smbXsrv_connection *conn, uint16_t vuid, NTTIME now, struct smbXsrv_session **session); +NTSTATUS smbXsrv_session_info_lookup(struct smbXsrv_client *client, + uint64_t session_wire_id, + struct auth_session_info **si); NTSTATUS smb2srv_session_table_init(struct smbXsrv_connection *conn); NTSTATUS smb2srv_session_lookup_conn(struct smbXsrv_connection *conn, uint64_t session_id, NTTIME now, diff --git a/source3/smbd/smbXsrv_session.c b/source3/smbd/smbXsrv_session.c index 9f113cc9db6..f51615f74e2 100644 --- a/source3/smbd/smbXsrv_session.c +++ b/source3/smbd/smbXsrv_session.c @@ -1854,6 +1854,51 @@ NTSTATUS smb1srv_session_lookup(struct smbXsrv_connection *conn, session); } +NTSTATUS smbXsrv_session_info_lookup(struct smbXsrv_client *client, + uint64_t session_wire_id, + struct auth_session_info **si) +{ + struct smbXsrv_session_table *table = client->session_table; + uint8_t key_buf[SMBXSRV_SESSION_LOCAL_TDB_KEY_SIZE]; + struct smbXsrv_session_local_fetch_state state = { + .session = NULL, + .status = NT_STATUS_INTERNAL_ERROR, + }; + TDB_DATA key; + NTSTATUS status; + + if (session_wire_id == 0) { + return NT_STATUS_USER_SESSION_DELETED; + } + + if (table == NULL) { + /* this might happen before the end of negprot */ + return NT_STATUS_USER_SESSION_DELETED; + } + + if (table->local.db_ctx == NULL) { + return NT_STATUS_INTERNAL_ERROR; + } + + key = smbXsrv_session_local_id_to_key(session_wire_id, key_buf); + + status = dbwrap_parse_record(table->local.db_ctx, key, + smbXsrv_session_local_fetch_parser, + &state); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + if (!NT_STATUS_IS_OK(state.status)) { + return state.status; + } + if (state.session->global->auth_session_info == NULL) { + return NT_STATUS_USER_SESSION_DELETED; + } + + *si = state.session->global->auth_session_info; + return NT_STATUS_OK; +} + NTSTATUS smb2srv_session_table_init(struct smbXsrv_connection *conn) { /*