HACK:smbd:smb2: fake support for persistent handles...
authorMichael Adam <obnox@samba.org>
Mon, 20 Jan 2014 15:16:08 +0000 (16:16 +0100)
committerMichael Adam <obnox@samba.org>
Fri, 9 May 2014 10:58:20 +0000 (12:58 +0200)
source3/smbd/smb2_create.c

index 52ed171cc0c6d9b2354dfa4c617ccb030588d6a9..aa690768fab6f9685b656425659873a1be540358 100644 (file)
@@ -600,6 +600,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                uint32_t durable_timeout_msec = 0;
                bool do_durable_reconnect = false;
                uint64_t persistent_id = 0;
+               bool persistent_requested = false;
 
                exta = smb2_create_blob_find(&in_context_blobs,
                                             SMB2_CREATE_TAG_EXTA);
@@ -692,6 +693,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                        const uint8_t *p = dh2q->data.data;
                        uint32_t durable_v2_timeout = 0;
                        DATA_BLOB create_guid_blob;
+                       uint32_t dh2q_flags;
 
                        if (dh2q->data.length != 32) {
                                tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
@@ -704,6 +706,10 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                        }
 
                        durable_v2_timeout = IVAL(p, 0);
+
+                       dh2q_flags = SVAL(p, 4);
+                       persistent_requested = dh2q_flags & SMB2_DHANDLE_FLAG_PERSISTENT;
+
                        create_guid_blob = data_blob_const(p + 16, 16);
 
                        status = GUID_from_ndr_blob(&create_guid_blob,
@@ -977,8 +983,15 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
 
                        op->global->durable = true;
                        op->global->durable_timeout_msec = durable_timeout_msec;
+
+                       if (persistent_requested &&
+                           lp_parm_bool(SNUM(smb2req->tcon->compat), "smbd", "announce CA", false))
+                       {
+                               op->global->persistent = true;
+                       }
                }
 
+
                if (update_open) {
                        op->global->create_guid = _create_guid;
 
@@ -1011,6 +1024,10 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                        DATA_BLOB blob = data_blob_const(p, sizeof(p));
                        uint32_t durable_v2_response_flags = 0;
 
+                       if (op->global->persistent) {
+                               durable_v2_response_flags |= SMB2_DHANDLE_FLAG_PERSISTENT;
+                       }
+
                        SIVAL(p, 0, op->global->durable_timeout_msec);
                        SIVAL(p, 4, durable_v2_response_flags);