]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:smbXsrv_session: cancel pending requests when we logoff a previous session
authorStefan Metzmacher <metze@samba.org>
Sat, 2 May 2015 14:13:27 +0000 (16:13 +0200)
committerKarolin Seeger <kseeger@samba.org>
Wed, 20 May 2015 14:34:29 +0000 (16:34 +0200)
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)

source3/smbd/smbXsrv_session.c

index a2ebfb192017bb5aa28be8b22db1aa02446644de..097d6ec985d51353a0b2f415199fd5e8262841ec 100644 (file)
@@ -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;