From: Stefan Metzmacher Date: Sat, 2 May 2015 14:13:27 +0000 (+0200) Subject: s3:smbXsrv_session: cancel pending requests when we logoff a previous session X-Git-Tag: samba-4.1.19~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6d611c6c35008df23a48ad051c5764b30e530cb3;p=thirdparty%2Fsamba.git 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 Reviewed-by: Jeremy Allison (similar to commit cc9d52e10f4f1b192171e03674061d4e8e6bcc84) --- 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;