summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h2
-rw-r--r--source3/include/smb.h1
-rw-r--r--source3/smbd/files.c33
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);
}