diff options
author | Jeremy Allison <jra@samba.org> | 2010-02-24 18:11:07 -0800 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2010-02-24 18:11:07 -0800 |
commit | d1950d66c4ed38918323bdb8c0bb11700a47bdc3 (patch) | |
tree | 0101c666e0272d8665cc09bccbdfb461f436a2bc /source3/smbd/conn.c | |
parent | 3c202519eccfa1922f315e2f2910d832016ad3f1 (diff) | |
download | samba-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.c | 27 |
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; } /**************************************************************************** |