smbXsrv: add a smbXsrv_connection argument to smbXsrv_session_local_lookup()
authorStefan Metzmacher <metze@samba.org>
Fri, 8 May 2015 21:12:19 +0000 (23:12 +0200)
committerMichael Adam <obnox@samba.org>
Wed, 29 Jul 2015 16:26:07 +0000 (18:26 +0200)
This way, we can verify that a session is valid on the 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>
source3/smbd/smbXsrv_session.c

index 3201670f7a375ae66e03cc6c9245584dd91b4cb4..256d8203a56397d883b65f889811123864b38904 100644 (file)
@@ -584,6 +584,8 @@ static void smbXsrv_session_local_fetch_parser(TDB_DATA key, TDB_DATA data,
 }
 
 static NTSTATUS smbXsrv_session_local_lookup(struct smbXsrv_session_table *table,
+                                            /* conn: optional */
+                                            struct smbXsrv_connection *conn,
                                             uint32_t session_local_id,
                                             NTTIME now,
                                             struct smbXsrv_session **_session)
@@ -629,6 +631,19 @@ static NTSTATUS smbXsrv_session_local_lookup(struct smbXsrv_session_table *table
                return NT_STATUS_USER_SESSION_DELETED;
        }
 
+       /*
+        * If a connection is specified check if the session is
+        * valid on the channel.
+        */
+       if (conn != NULL) {
+               struct smbXsrv_channel_global0 *c = NULL;
+
+               status = smbXsrv_session_find_channel(state.session, conn, &c);
+               if (!NT_STATUS_IS_OK(status)) {
+                       return status;
+               }
+       }
+
        state.session->idle_time = now;
 
        if (!NT_STATUS_IS_OK(state.session->status)) {
@@ -1719,7 +1734,8 @@ NTSTATUS smb1srv_session_lookup(struct smbXsrv_connection *conn,
        struct smbXsrv_session_table *table = conn->client->session_table;
        uint32_t local_id = vuid;
 
-       return smbXsrv_session_local_lookup(table, local_id, now, session);
+       return smbXsrv_session_local_lookup(table, conn, local_id, now,
+                                           session);
 }
 
 NTSTATUS smb2srv_session_table_init(struct smbXsrv_connection *conn)
@@ -1742,7 +1758,8 @@ static NTSTATUS smb2srv_session_lookup_raw(struct smbXsrv_session_table *table,
                return NT_STATUS_USER_SESSION_DELETED;
        }
 
-       return smbXsrv_session_local_lookup(table, local_id, now, session);
+       return smbXsrv_session_local_lookup(table, NULL, local_id, now,
+                                           session);
 }
 
 NTSTATUS smb2srv_session_lookup(struct smbXsrv_connection *conn,