return state.session->status;
}
+static int smbXsrv_session_global_destructor(struct smbXsrv_session_global0 *global)
+{
+ return 0;
+}
+
static NTSTATUS smbXsrv_session_global_allocate(struct db_context *db,
TALLOC_CTX *mem_ctx,
struct smbXsrv_session_global0 **_global)
if (global == NULL) {
return NT_STATUS_NO_MEMORY;
}
- //talloc_set_destructor(global, smbXsrv_session_global_destructor);
+ talloc_set_destructor(global, smbXsrv_session_global_destructor);
for (i = 0; i < UINT32_MAX; i++) {
uint32_t id;
return NT_STATUS_OK;
}
+static int smbXsrv_session_destructor(struct smbXsrv_session *session)
+{
+ struct smbXsrv_session_table *table;
+ struct db_record *local_rec = NULL;
+ struct db_record *global_rec = NULL;
+ NTSTATUS status;
+
+ if (session->connection == NULL) {
+ return 0;
+ }
+
+ table = &session->connection->session_table;
+ session->connection = NULL;
+
+ local_rec = session->db_rec;
+ session->db_rec = NULL;
+ if (local_rec == NULL) {
+ uint8_t key_buf[sizeof(uint32_t)];
+ TDB_DATA key;
+
+ RSIVAL(key_buf, 0, session->local_id);
+ key = make_tdb_data(key_buf, sizeof(key_buf));
+
+ local_rec = dbwrap_fetch_locked(table->local.db_ctx,
+ session, key);
+ }
+
+ if (local_rec != NULL) {
+ status = dbwrap_record_delete(local_rec);
+ }
+
+ global_rec = session->global->db_rec;
+ session->global->db_rec = NULL;
+ if (global_rec == NULL) {
+ uint8_t key_buf[sizeof(uint32_t)];
+ TDB_DATA key;
+
+ RSIVAL(key_buf, 0, session->global->session_global_id);
+ key = make_tdb_data(key_buf, sizeof(key_buf));
+
+ global_rec = dbwrap_fetch_locked(table->global.db_ctx,
+ session->global, key);
+ }
+
+ if (global_rec != NULL) {
+ status = dbwrap_record_delete(global_rec);
+ }
+ TALLOC_FREE(session->global);
+
+ return 0;
+}
+
NTSTATUS smbXsrv_session_create(struct smbXsrv_connection *conn,
NTTIME now,
struct smbXsrv_session **_session)
}
session->global = global;
+ talloc_set_destructor(session, smbXsrv_session_destructor);
+
if (conn->protocol >= PROTOCOL_SMB2_02) {
uint64_t id = global->session_global_id;
uint8_t key_buf[sizeof(uint32_t)];
talloc_free(session);
return status;
}
- //talloc_set_destructor(session, smbXsrv_session_destructor);
global->creation_time = now;
global->expiration_time = UINT64_MAX;//NTTIME_INFINITY;