summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2015-05-02 16:13:27 +0200
committerKarolin Seeger <kseeger@samba.org>2015-05-20 16:34:29 +0200
commit6d611c6c35008df23a48ad051c5764b30e530cb3 (patch)
tree5fa602a30cb6b8df284b46998560f71be2d98c95 /source3
parent75b9a6f37f21e4ae610ce8ec1334ff38756ff1ca (diff)
downloadsamba-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.c45
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;