diff options
author | Jeremy Allison <jra@samba.org> | 2013-04-09 10:29:47 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2013-04-11 09:49:41 -0700 |
commit | 7e437a39abaee1133ea4c30e75ef53eb47ca64b6 (patch) | |
tree | a7af01ec9a2cf990afdfafd9934a39d3e147b897 | |
parent | cdcb6319127883d724508da3f6140a1e2aca75af (diff) | |
download | samba-7e437a39abaee1133ea4c30e75ef53eb47ca64b6.tar.gz samba-7e437a39abaee1133ea4c30e75ef53eb47ca64b6.tar.bz2 samba-7e437a39abaee1133ea4c30e75ef53eb47ca64b6.zip |
Clean error paths in opendir and fd_opendir by only setting handle data on success.
Pass extra struct dirsort_privates * to open_and_sort_dir() function
to avoid it having to re-read the handle data.
Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
-rw-r--r-- | source3/modules/vfs_dirsort.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/source3/modules/vfs_dirsort.c b/source3/modules/vfs_dirsort.c index 3ea720fc11..d6f19b52ec 100644 --- a/source3/modules/vfs_dirsort.c +++ b/source3/modules/vfs_dirsort.c @@ -40,7 +40,8 @@ static void free_dirsort_privates(void **datap) { TALLOC_FREE(*datap); } -static bool open_and_sort_dir (vfs_handle_struct *handle) +static bool open_and_sort_dir(vfs_handle_struct *handle, + struct dirsort_privates *data) { struct stat dir_stat; unsigned int i; @@ -115,14 +116,15 @@ static DIR *dirsort_opendir(vfs_handle_struct *handle, data->fd = dirfd(data->source_directory); - SMB_VFS_HANDLE_SET_DATA(handle, data, free_dirsort_privates, - struct dirsort_privates, return NULL); - - if (!open_and_sort_dir(handle)) { + if (!open_and_sort_dir(handle, data)) { SMB_VFS_NEXT_CLOSEDIR(handle,data->source_directory); + TALLOC_FREE(data); return NULL; } + SMB_VFS_HANDLE_SET_DATA(handle, data, free_dirsort_privates, + struct dirsort_privates, return NULL); + return data->source_directory; } @@ -153,16 +155,17 @@ static DIR *dirsort_fdopendir(vfs_handle_struct *handle, data->fd = dirfd(data->source_directory); - SMB_VFS_HANDLE_SET_DATA(handle, data, free_dirsort_privates, - struct dirsort_privates, return NULL); - - if (!open_and_sort_dir(handle)) { + if (!open_and_sort_dir(handle, data)) { SMB_VFS_NEXT_CLOSEDIR(handle,data->source_directory); + TALLOC_FREE(data); /* fd is now closed. */ fsp->fh->fd = -1; return NULL; } + SMB_VFS_HANDLE_SET_DATA(handle, data, free_dirsort_privates, + struct dirsort_privates, return NULL); + return data->source_directory; } @@ -185,7 +188,7 @@ static struct dirent *dirsort_readdir(vfs_handle_struct *handle, /* throw away cache and re-read the directory if we've changed */ if (current_mtime > data->mtime) { - open_and_sort_dir(handle); + open_and_sort_dir(handle, data); } if (data->pos >= data->number_of_entries) { |