diff options
-rw-r--r-- | source3/include/proto.h | 2 | ||||
-rw-r--r-- | source3/include/smb.h | 1 | ||||
-rw-r--r-- | source3/smbd/files.c | 33 |
3 files changed, 35 insertions, 1 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 29dbcc9763..fafcf6be52 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -4764,6 +4764,8 @@ files_struct *file_fsp(struct smb_request *req, uint16 fid); NTSTATUS dup_file_fsp(struct smb_request *req, files_struct *from, uint32 access_mask, uint32 share_access, uint32 create_options, files_struct *to); +NTSTATUS file_name_hash(connection_struct *conn, + const char *name, uint32_t *p_name_hash); NTSTATUS fsp_set_smb_fname(struct files_struct *fsp, const struct smb_filename *smb_fname_in); diff --git a/source3/include/smb.h b/source3/include/smb.h index 1a76691a44..6cfb6307d0 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -346,6 +346,7 @@ typedef struct files_struct { bool posix_open; bool is_sparse; struct smb_filename *fsp_name; + uint32_t name_hash; /* Jenkins hash of full pathname. */ struct vfs_fsp_data *vfs_extension; struct fake_file_handle *fake_file_handle; diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 7275868ffa..f01da2c8a2 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -591,6 +591,35 @@ NTSTATUS dup_file_fsp(struct smb_request *req, files_struct *from, } /** + * Return a jenkins hash of a pathname on a connection. + */ + +NTSTATUS file_name_hash(connection_struct *conn, + const char *name, uint32_t *p_name_hash) +{ + TDB_DATA key; + char *fullpath = NULL; + + /* Set the hash of the full pathname. */ + fullpath = talloc_asprintf(talloc_tos(), + "%s/%s", + conn->connectpath, + name); + if (!fullpath) { + return NT_STATUS_NO_MEMORY; + } + key = string_term_tdb_data(fullpath); + *p_name_hash = tdb_jenkins_hash(&key); + + DEBUG(10,("file_name_hash: %s hash 0x%x\n", + fullpath, + (unsigned int)*p_name_hash )); + + TALLOC_FREE(fullpath); + return NT_STATUS_OK; +} + +/** * The only way that the fsp->fsp_name field should ever be set. */ NTSTATUS fsp_set_smb_fname(struct files_struct *fsp, @@ -607,5 +636,7 @@ NTSTATUS fsp_set_smb_fname(struct files_struct *fsp, TALLOC_FREE(fsp->fsp_name); fsp->fsp_name = smb_fname_new; - return NT_STATUS_OK; + return file_name_hash(fsp->conn, + smb_fname_str_dbg(fsp->fsp_name), + &fsp->name_hash); } |