mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
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
This commit is contained in:
parent
47f837c105
commit
3f110e50bf
@ -626,15 +626,12 @@ struct files_struct *file_fsp_smb2(struct smbd_smb2_request *smb2req,
|
|||||||
uint64_t volatile_id)
|
uint64_t volatile_id)
|
||||||
{
|
{
|
||||||
struct files_struct *fsp;
|
struct files_struct *fsp;
|
||||||
|
uint64_t fsp_persistent;
|
||||||
|
|
||||||
if (smb2req->compat_chain_fsp != NULL) {
|
if (smb2req->compat_chain_fsp != NULL) {
|
||||||
return smb2req->compat_chain_fsp;
|
return smb2req->compat_chain_fsp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (persistent_id != volatile_id) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (volatile_id > UINT16_MAX) {
|
if (volatile_id > UINT16_MAX) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -643,6 +640,11 @@ struct files_struct *file_fsp_smb2(struct smbd_smb2_request *smb2req,
|
|||||||
if (fsp == NULL) {
|
if (fsp == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
fsp_persistent = fsp_persistent_id(fsp);
|
||||||
|
|
||||||
|
if (persistent_id != fsp_persistent) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (smb2req->tcon == NULL) {
|
if (smb2req->tcon == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -237,6 +237,7 @@ void send_break_message_smb2(files_struct *fsp, int level)
|
|||||||
SMB2_OPLOCK_LEVEL_II :
|
SMB2_OPLOCK_LEVEL_II :
|
||||||
SMB2_OPLOCK_LEVEL_NONE;
|
SMB2_OPLOCK_LEVEL_NONE;
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
|
uint64_t fsp_persistent = fsp_persistent_id(fsp);
|
||||||
|
|
||||||
DEBUG(10,("send_break_message_smb2: sending oplock break "
|
DEBUG(10,("send_break_message_smb2: sending oplock break "
|
||||||
"for file %s, fnum = %d, smb2 level %u\n",
|
"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 ));
|
(unsigned int)smb2_oplock_level ));
|
||||||
|
|
||||||
status = smbd_smb2_send_oplock_break(fsp->conn->sconn,
|
status = smbd_smb2_send_oplock_break(fsp->conn->sconn,
|
||||||
(uint64_t)fsp->fnum,
|
fsp_persistent,
|
||||||
(uint64_t)fsp->fnum,
|
(uint64_t)fsp->fnum,
|
||||||
smb2_oplock_level);
|
smb2_oplock_level);
|
||||||
if (!NT_STATUS_IS_OK(status)) {
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
@ -822,7 +822,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
|
|||||||
if (state->out_file_attributes == 0) {
|
if (state->out_file_attributes == 0) {
|
||||||
state->out_file_attributes = FILE_ATTRIBUTE_NORMAL;
|
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_file_id_volatile = result->fnum;
|
||||||
state->out_context_blobs = out_context_blobs;
|
state->out_context_blobs = out_context_blobs;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user