libcli/smb: call smb2cli_validate_negotiate_info*() after each authenticated tcon
authorStefan Metzmacher <metze@samba.org>
Fri, 26 Sep 2014 19:17:10 +0000 (21:17 +0200)
committerMichael Adam <obnox@samba.org>
Tue, 30 Sep 2014 21:35:08 +0000 (23:35 +0200)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
libcli/smb/smb2cli_tcon.c

index 21c675e8d1ebb745d1e94c3ee5b9a94acb465cfb..dd310431ff0d31c04c646ecbd040e9c75991a4c5 100644 (file)
@@ -24,7 +24,9 @@
 #include "../libcli/smb/smbXcli_base.h"
 
 struct smb2cli_tcon_state {
+       struct tevent_context *ev;
        struct smbXcli_conn *conn;
+       uint32_t timeout_msec;
        struct smbXcli_session *session;
        struct smbXcli_tcon *tcon;
        uint8_t fixed[8];
@@ -54,7 +56,9 @@ struct tevent_req *smb2cli_tcon_send(TALLOC_CTX *mem_ctx,
        if (req == NULL) {
                return NULL;
        }
+       state->ev = ev;
        state->conn = conn;
+       state->timeout_msec = timeout_msec;
        state->session = session;
        state->tcon = tcon;
 
@@ -96,9 +100,12 @@ struct tevent_req *smb2cli_tcon_send(TALLOC_CTX *mem_ctx,
                return tevent_req_post(req, ev);
        }
        tevent_req_set_callback(subreq, smb2cli_tcon_done, req);
+
        return req;
 }
 
+static void smb2cli_tcon_validate(struct tevent_req *subreq);
+
 static void smb2cli_tcon_done(struct tevent_req *subreq)
 {
        struct tevent_req *req = tevent_req_callback_data(
@@ -144,6 +151,39 @@ static void smb2cli_tcon_done(struct tevent_req *subreq)
                                share_capabilities,
                                maximal_access);
 
+       if (!smbXcli_session_is_authenticated(state->session)) {
+               tevent_req_done(req);
+               return;
+       }
+
+       subreq = smb2cli_validate_negotiate_info_send(state, state->ev,
+                                                     state->conn,
+                                                     state->timeout_msec,
+                                                     state->session,
+                                                     state->tcon);
+       if (tevent_req_nomem(subreq, req)) {
+               return;
+       }
+       tevent_req_set_callback(subreq, smb2cli_tcon_validate, req);
+}
+
+static void smb2cli_tcon_validate(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+               subreq, struct tevent_req);
+       struct smb2cli_tcon_state *state = tevent_req_data(
+               req, struct smb2cli_tcon_state);
+       NTSTATUS status;
+
+       status = smb2cli_validate_negotiate_info_recv(subreq);
+       TALLOC_FREE(subreq);
+       if (!NT_STATUS_IS_OK(status)) {
+               smb2cli_tcon_set_values(state->tcon, NULL,
+                                       UINT32_MAX, 0, 0, 0, 0);
+               tevent_req_nterror(req, status);
+               return;
+       }
+
        tevent_req_done(req);
 }