diff options
author | Stefan Metzmacher <metze@samba.org> | 2012-06-13 12:13:01 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2012-06-14 22:04:10 +0200 |
commit | 3f110e50bfdbaf6958c12098e06ef599341d7e3b (patch) | |
tree | 7c036e9a07bf555559418269de9e49dc1273f0c1 /source3/smbd | |
parent | 47f837c105ee7b70b7e80e41772b7c9470bbe153 (diff) | |
download | samba-3f110e50bfdbaf6958c12098e06ef599341d7e3b.tar.gz samba-3f110e50bfdbaf6958c12098e06ef599341d7e3b.tar.bz2 samba-3f110e50bfdbaf6958c12098e06ef599341d7e3b.zip |
s3:smbd: use fsp_persistent_id() as persistent_file_id part for SMB2 (bug #8995)
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
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/files.c | 10 | ||||
-rw-r--r-- | source3/smbd/smb2_break.c | 3 | ||||
-rw-r--r-- | source3/smbd/smb2_create.c | 2 |
3 files changed, 9 insertions, 6 deletions
diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 18330805d8..d410083009 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -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 fsp_persistent; 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; } @@ -643,6 +640,11 @@ struct files_struct *file_fsp_smb2(struct smbd_smb2_request *smb2req, if (fsp == NULL) { return NULL; } + fsp_persistent = fsp_persistent_id(fsp); + + if (persistent_id != fsp_persistent) { + return NULL; + } if (smb2req->tcon == NULL) { return NULL; diff --git a/source3/smbd/smb2_break.c b/source3/smbd/smb2_break.c index 75505e5ab8..9318068699 100644 --- a/source3/smbd/smb2_break.c +++ b/source3/smbd/smb2_break.c @@ -237,6 +237,7 @@ void send_break_message_smb2(files_struct *fsp, int level) 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", @@ -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, - (uint64_t)fsp->fnum, + fsp_persistent, (uint64_t)fsp->fnum, smb2_oplock_level); if (!NT_STATUS_IS_OK(status)) { diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c index 2aedfb6496..9881ed2d51 100644 --- a/source3/smbd/smb2_create.c +++ b/source3/smbd/smb2_create.c @@ -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; } - 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; |