summaryrefslogtreecommitdiff
path: root/source3/smbd/conn.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2010-02-24 18:11:07 -0800
committerJeremy Allison <jra@samba.org>2010-02-24 18:11:07 -0800
commitd1950d66c4ed38918323bdb8c0bb11700a47bdc3 (patch)
tree0101c666e0272d8665cc09bccbdfb461f436a2bc /source3/smbd/conn.c
parent3c202519eccfa1922f315e2f2910d832016ad3f1 (diff)
downloadsamba-d1950d66c4ed38918323bdb8c0bb11700a47bdc3.tar.gz
samba-d1950d66c4ed38918323bdb8c0bb11700a47bdc3.tar.bz2
samba-d1950d66c4ed38918323bdb8c0bb11700a47bdc3.zip
Make conn_close_all() safe to call from SMB2 sessions (fix crash bug).
Ensure we don't call close_cnum() with SMB2, also talloc_move the compat_conn pointer from the NULL context onto the tcon context in SMB2 as it's conceptually owned by that pointer. Jeremy.
Diffstat (limited to 'source3/smbd/conn.c')
-rw-r--r--source3/smbd/conn.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/source3/smbd/conn.c b/source3/smbd/conn.c
index 959fcd7754..51f880d9df 100644
--- a/source3/smbd/conn.c
+++ b/source3/smbd/conn.c
@@ -177,15 +177,26 @@ return true if any were closed
****************************************************************************/
bool conn_close_all(struct smbd_server_connection *sconn)
{
- connection_struct *conn, *next;
- bool ret = false;
- for (conn=sconn->smb1.tcons.Connections;conn;conn=next) {
- next=conn->next;
- set_current_service(conn, 0, True);
- close_cnum(conn, conn->vuid);
- ret = true;
+ if (sconn->allow_smb2) {
+ /* SMB2 */
+ if (sconn->smb2.sessions.list &&
+ sconn->smb2.sessions.list->tcons.list) {
+ return true;
+ }
+ return false;
+ } else {
+ /* SMB1 */
+ connection_struct *conn, *next;
+ bool ret = false;
+
+ for (conn=sconn->smb1.tcons.Connections;conn;conn=next) {
+ next=conn->next;
+ set_current_service(conn, 0, True);
+ close_cnum(conn, conn->vuid);
+ ret = true;
+ }
+ return ret;
}
- return ret;
}
/****************************************************************************