smbd:smb2: treat persistent handles in durable reconnect v2
authorMichael Adam <obnox@samba.org>
Wed, 22 Jan 2014 14:26:28 +0000 (15:26 +0100)
committerMichael Adam <obnox@samba.org>
Fri, 9 May 2014 10:58:21 +0000 (12:58 +0200)
source3/smbd/smb2_create.c

index 328c020703c832f7a26509a8d01a17d9f5e5d185..0cb35e0086fe2352e9f905bcbed5b7ca9f739638 100644 (file)
@@ -750,6 +750,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                if (dh2c) {
                        const uint8_t *p = dh2c->data.data;
                        DATA_BLOB create_guid_blob;
+                       uint32_t dh2c_flags;
 
                        persistent_id = BVAL(p, 0);
                        create_guid_blob = data_blob_const(p + 16, 16);
@@ -761,6 +762,9 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                        }
                        create_guid = &_create_guid;
 
+                       dh2c_flags = SVAL(p, 32);
+                       persistent_requested = dh2c_flags & SMB2_DHANDLE_FLAG_PERSISTENT;
+
                        do_durable_reconnect = true;
                }
 
@@ -847,6 +851,13 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                                return tevent_req_post(req, ev);
                        }
 
+                       if (op->global->persistent && !persistent_requested) {
+                               talloc_free(op);
+                               tevent_req_nterror(req,
+                                       NT_STATUS_OBJECT_NAME_NOT_FOUND);
+                               return tevent_req_post(req, ev);
+                       }
+
                        status = SMB_VFS_DURABLE_RECONNECT(smb1req->conn,
                                                smb1req,
                                                op, /* smbXsrv_open input */