s4:librpc/dcerpc_smb: make use of smbXcli_session_application_key()
authorStefan Metzmacher <metze@samba.org>
Wed, 1 Aug 2012 07:09:34 +0000 (09:09 +0200)
committerStefan Metzmacher <metze@samba.org>
Wed, 1 Aug 2012 12:17:13 +0000 (14:17 +0200)
metze

source4/librpc/rpc/dcerpc_smb.c

index f4f44577f4d06ff2fb3562e7252e3ce8aae86d24..e718725a74e97964ef2fbfbf3ab4b40e6331b7f0 100644 (file)
@@ -32,6 +32,7 @@
 struct smb_private {
        uint16_t fnum;
        struct smbcli_tree *tree;
+       DATA_BLOB session_key;
        const char *server_name;
        bool dead;
 };
@@ -429,11 +430,13 @@ static NTSTATUS smb_session_key(struct dcecli_connection *c, DATA_BLOB *session_
        struct smb_private *smb = (struct smb_private *)c->transport.private_data;
 
        if (smb == NULL) return NT_STATUS_CONNECTION_DISCONNECTED;
-       if (smb->tree->session->user_session_key.data) {
-               *session_key = smb->tree->session->user_session_key;
-               return NT_STATUS_OK;
+
+       if (smb->session_key.length == 0) {
+               return NT_STATUS_NO_USER_SESSION_KEY;
        }
-       return NT_STATUS_NO_USER_SESSION_KEY;
+
+       *session_key = smb->session_key;
+       return NT_STATUS_OK;
 }
 
 struct pipe_open_smb_state {
@@ -555,6 +558,14 @@ static void pipe_open_recv(struct smbcli_request *req)
        if (composite_nomem(smb->server_name, ctx)) return;
        smb->dead       = false;
 
+       ctx->status = smbXcli_session_application_key(state->tree->session->smbXcli,
+                                                     smb, &smb->session_key);
+       if (NT_STATUS_EQUAL(ctx->status, NT_STATUS_NO_USER_SESSION_KEY)) {
+               smb->session_key = data_blob_null;
+               ctx->status = NT_STATUS_OK;
+       }
+       if (!composite_is_ok(ctx)) return;
+
        c->transport.private_data = smb;
 
        composite_done(ctx);