smbXsrv_session destructor
authorStefan Metzmacher <metze@samba.org>
Fri, 3 Feb 2012 10:33:09 +0000 (11:33 +0100)
committerStefan Metzmacher <metze@samba.org>
Thu, 10 May 2012 16:41:08 +0000 (18:41 +0200)
source3/smbd/smbXsrv_session.c

index 3b5938888c19e9595afaf456ca9b8e46d4fb8a8b..0e7280db23dd3344921d9ac18a5a411eb92d6474 100644 (file)
@@ -315,6 +315,11 @@ static NTSTATUS smbXsrv_session_local_lookup(struct smbXsrv_session_table *table
        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)
@@ -328,7 +333,7 @@ static NTSTATUS smbXsrv_session_global_allocate(struct db_context *db,
        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;
@@ -471,6 +476,58 @@ static NTSTATUS smbXsrv_session_global_lookup(struct smbXsrv_session_table *tabl
        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)
@@ -508,6 +565,8 @@ NTSTATUS smbXsrv_session_create(struct smbXsrv_connection *conn,
        }
        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)];
@@ -554,7 +613,6 @@ NTSTATUS smbXsrv_session_create(struct smbXsrv_connection *conn,
                talloc_free(session);
                return status;
        }
-       //talloc_set_destructor(session, smbXsrv_session_destructor);
 
        global->creation_time = now;
        global->expiration_time = UINT64_MAX;//NTTIME_INFINITY;