diff options
author | Stefan Metzmacher <metze@samba.org> | 2015-05-02 16:13:27 +0200 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2015-05-20 16:34:29 +0200 |
commit | 6d611c6c35008df23a48ad051c5764b30e530cb3 (patch) | |
tree | 5fa602a30cb6b8df284b46998560f71be2d98c95 /source3 | |
parent | 75b9a6f37f21e4ae610ce8ec1334ff38756ff1ca (diff) | |
download | samba-6d611c6c35008df23a48ad051c5764b30e530cb3.tar.gz |
s3:smbXsrv_session: cancel pending requests when we logoff a previous session
Bug: https://bugzilla.samba.org/show_bug.cgi?id=11182
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
(similar to commit cc9d52e10f4f1b192171e03674061d4e8e6bcc84)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/smbd/smbXsrv_session.c | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/source3/smbd/smbXsrv_session.c b/source3/smbd/smbXsrv_session.c index a2ebfb19201..097d6ec985d 100644 --- a/source3/smbd/smbXsrv_session.c +++ b/source3/smbd/smbXsrv_session.c @@ -228,6 +228,8 @@ static NTSTATUS smbXsrv_session_table_init(struct smbXsrv_connection *conn, return NT_STATUS_OK; } +static void smbXsrv_session_close_shutdown_done(struct tevent_req *subreq); + static void smbXsrv_session_close_loop(struct tevent_req *subreq) { struct smbXsrv_connection *conn = @@ -331,20 +333,22 @@ static void smbXsrv_session_close_loop(struct tevent_req *subreq) goto next; } - /* - * TODO: cancel all outstanding requests on the session - */ - status = smbXsrv_session_logoff(session); - if (!NT_STATUS_IS_OK(status)) { + subreq = smb2srv_session_shutdown_send(session, conn->ev_ctx, + session, NULL); + if (subreq == NULL) { + status = NT_STATUS_NO_MEMORY; DEBUG(0, ("smbXsrv_session_close_loop: " - "smbXsrv_session_logoff(%llu) failed: %s\n", + "smb2srv_session_shutdown_send(%llu) failed: %s\n", (unsigned long long)session->global->session_wire_id, nt_errstr(status))); if (DEBUGLVL(1)) { NDR_PRINT_DEBUG(smbXsrv_session_closeB, &close_blob); } + goto next; } - TALLOC_FREE(session); + tevent_req_set_callback(subreq, + smbXsrv_session_close_shutdown_done, + session); next: TALLOC_FREE(rec); @@ -358,6 +362,33 @@ next: tevent_req_set_callback(subreq, smbXsrv_session_close_loop, conn); } +static void smbXsrv_session_close_shutdown_done(struct tevent_req *subreq) +{ + struct smbXsrv_session *session = + tevent_req_callback_data(subreq, + struct smbXsrv_session); + NTSTATUS status; + + status = smb2srv_session_shutdown_recv(subreq); + TALLOC_FREE(subreq); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("smbXsrv_session_close_loop: " + "smb2srv_session_shutdown_recv(%llu) failed: %s\n", + (unsigned long long)session->global->session_wire_id, + nt_errstr(status))); + } + + status = smbXsrv_session_logoff(session); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("smbXsrv_session_close_loop: " + "smbXsrv_session_logoff(%llu) failed: %s\n", + (unsigned long long)session->global->session_wire_id, + nt_errstr(status))); + } + + TALLOC_FREE(session); +} + struct smb1srv_session_local_allocate_state { const uint32_t lowest_id; const uint32_t highest_id; |