s3:smbd: use fsp_persistent_id() as persistent_file_id part for SMB2 (bug #8995)
authorStefan Metzmacher <metze@samba.org>
Wed, 13 Jun 2012 10:13:01 +0000 (12:13 +0200)
committerStefan Metzmacher <metze@samba.org>
Thu, 14 Jun 2012 20:04:10 +0000 (22:04 +0200)
It seems to be important to have unique persistent file ids,
because windows clients seem to index files by server_guid + persistent_file_id.
Which may break, if we just have a 16-bit range per connection
and the client connects multiple times.

Based on code from Ira Cooper. Use fsp->fh->gen_id as the persistent
fileid in SMB2.

metze

Autobuild-User(master): Stefan Metzmacher <metze@samba.org>
Autobuild-Date(master): Thu Jun 14 22:04:13 CEST 2012 on sn-devel-104

source3/smbd/files.c
source3/smbd/smb2_break.c
source3/smbd/smb2_create.c

index 18330805d8b2943508a546514455c3f9ba123910..d4100830097d7216407f662278bb373dfa6711aa 100644 (file)
@@ -626,15 +626,12 @@ struct files_struct *file_fsp_smb2(struct smbd_smb2_request *smb2req,
                                   uint64_t volatile_id)
 {
        struct files_struct *fsp;
                                   uint64_t volatile_id)
 {
        struct files_struct *fsp;
+       uint64_t fsp_persistent;
 
        if (smb2req->compat_chain_fsp != NULL) {
                return smb2req->compat_chain_fsp;
        }
 
 
        if (smb2req->compat_chain_fsp != NULL) {
                return smb2req->compat_chain_fsp;
        }
 
-       if (persistent_id != volatile_id) {
-               return NULL;
-       }
-
        if (volatile_id > UINT16_MAX) {
                return NULL;
        }
        if (volatile_id > UINT16_MAX) {
                return NULL;
        }
@@ -643,6 +640,11 @@ struct files_struct *file_fsp_smb2(struct smbd_smb2_request *smb2req,
        if (fsp == NULL) {
                return NULL;
        }
        if (fsp == NULL) {
                return NULL;
        }
+       fsp_persistent = fsp_persistent_id(fsp);
+
+       if (persistent_id != fsp_persistent) {
+               return NULL;
+       }
 
        if (smb2req->tcon == NULL) {
                return NULL;
 
        if (smb2req->tcon == NULL) {
                return NULL;
index 75505e5ab845b1a1eb8b9a96d99c8d1281700302..9318068699eedf5c37a91200825a77909eb6d6bb 100644 (file)
@@ -237,6 +237,7 @@ void send_break_message_smb2(files_struct *fsp, int level)
                                SMB2_OPLOCK_LEVEL_II :
                                SMB2_OPLOCK_LEVEL_NONE;
        NTSTATUS status;
                                SMB2_OPLOCK_LEVEL_II :
                                SMB2_OPLOCK_LEVEL_NONE;
        NTSTATUS status;
+       uint64_t fsp_persistent = fsp_persistent_id(fsp);
 
        DEBUG(10,("send_break_message_smb2: sending oplock break "
                "for file %s, fnum = %d, smb2 level %u\n",
 
        DEBUG(10,("send_break_message_smb2: sending oplock break "
                "for file %s, fnum = %d, smb2 level %u\n",
@@ -245,7 +246,7 @@ void send_break_message_smb2(files_struct *fsp, int level)
                (unsigned int)smb2_oplock_level ));
 
        status = smbd_smb2_send_oplock_break(fsp->conn->sconn,
                (unsigned int)smb2_oplock_level ));
 
        status = smbd_smb2_send_oplock_break(fsp->conn->sconn,
-                                       (uint64_t)fsp->fnum,
+                                       fsp_persistent,
                                        (uint64_t)fsp->fnum,
                                        smb2_oplock_level);
        if (!NT_STATUS_IS_OK(status)) {
                                        (uint64_t)fsp->fnum,
                                        smb2_oplock_level);
        if (!NT_STATUS_IS_OK(status)) {
index 2aedfb64969b624911c026d411bda65d058fad73..9881ed2d515b8e1b90d039ac82f01c704d9d36c9 100644 (file)
@@ -822,7 +822,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
        if (state->out_file_attributes == 0) {
                state->out_file_attributes = FILE_ATTRIBUTE_NORMAL;
        }
        if (state->out_file_attributes == 0) {
                state->out_file_attributes = FILE_ATTRIBUTE_NORMAL;
        }
-       state->out_file_id_persistent = result->fnum;
+       state->out_file_id_persistent = fsp_persistent_id(result);
        state->out_file_id_volatile = result->fnum;
        state->out_context_blobs = out_context_blobs;
 
        state->out_file_id_volatile = result->fnum;
        state->out_context_blobs = out_context_blobs;