diff options
author | Volker Lendecke <vl@samba.org> | 2009-11-16 09:49:23 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2009-11-18 23:16:13 +0100 |
commit | f6650f5d19ad90b8e1f392efbe211c4ffa0e70c0 (patch) | |
tree | 6091c37e17a96edaaab867094b99bfe8c5aa456d /source3/modules/vfs_catia.c | |
parent | aea3a8f50131744f8393d0179cd04a1b97982028 (diff) | |
download | samba-f6650f5d19ad90b8e1f392efbe211c4ffa0e70c0.tar.gz samba-f6650f5d19ad90b8e1f392efbe211c4ffa0e70c0.tar.bz2 samba-f6650f5d19ad90b8e1f392efbe211c4ffa0e70c0.zip |
s3: Do not talloc in readdir
This is a hot codepath (called from the stat cache)
Diffstat (limited to 'source3/modules/vfs_catia.c')
-rw-r--r-- | source3/modules/vfs_catia.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/source3/modules/vfs_catia.c b/source3/modules/vfs_catia.c index 14e404f9f5..f1d0cadee7 100644 --- a/source3/modules/vfs_catia.c +++ b/source3/modules/vfs_catia.c @@ -286,11 +286,14 @@ static SMB_STRUCT_DIR *catia_opendir(vfs_handle_struct *handle, * TRANSLATE_NAME call which converts the given name to * "WINDOWS displayable" name */ -static NTSTATUS catia_translate_name(vfs_handle_struct *handle, - char **mapped_name, - enum vfs_translate_direction direction) +static NTSTATUS catia_translate_name(struct vfs_handle_struct *handle, + const char *orig_name, + enum vfs_translate_direction direction, + TALLOC_CTX *mem_ctx, + char **pmapped_name) { char *name = NULL; + char *mapped_name; NTSTATUS ret; /* @@ -299,21 +302,27 @@ static NTSTATUS catia_translate_name(vfs_handle_struct *handle, * We will be allocating new memory for mapped_name in * catia_string_replace_allocate */ - name = talloc_strdup(talloc_tos(), *mapped_name); + name = talloc_strdup(talloc_tos(), orig_name); if (!name) { errno = ENOMEM; return NT_STATUS_NO_MEMORY; } - TALLOC_FREE(*mapped_name); ret = catia_string_replace_allocate(handle->conn, name, - mapped_name, direction); + &mapped_name, direction); TALLOC_FREE(name); if (!NT_STATUS_IS_OK(ret)) { return ret; } - ret = SMB_VFS_NEXT_TRANSLATE_NAME(handle, mapped_name, direction); + ret = SMB_VFS_NEXT_TRANSLATE_NAME(handle, mapped_name, direction, + mem_ctx, pmapped_name); + + if (NT_STATUS_EQUAL(ret, NT_STATUS_NONE_MAPPED)) { + *pmapped_name = talloc_move(mem_ctx, &mapped_name); + } else { + TALLOC_FREE(mapped_name); + } return ret; } |