mirror of
https://github.com/samba-team/samba.git
synced 2025-01-13 13:18:06 +03:00
s3: smbd: Move the setting of the destructor of struct smb_Dir * up two levels.
Previously, open_dir_safely() called OpenDir_internal() which set the destructor. Move setting the destructor into the callers of open_dir_safely() as this will allow us to have different destructors for handle-based calls. The reason this is important is that I have a follow up patchset that depends on this which makes all client directory enumerations handle-based, calling OpenDir_fsp() only, and so the destructor there will take care of the fsp back pointer. Trying to keep a common destructor for handle-based and non-handle based calls broke my brain when trying to separate the handle-based calls from the non-handle based ones in my later patchset. NB. The change in OpenDir_fsp() isn't a logic change as instead of doing an early return from a function that sets the destructor, we now fallthrough to setting the destructor then return, which is identical. Eventually the whole codepath using the fallback for non-handle opens inside dptr_create() will go away and this simplifies the code immensely. Some short term pain for long-term gain :-). Added doxygen documentation as requested. Signed-off-by: Jeremy Allison <jra@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org>
This commit is contained in:
parent
41c94b8b1f
commit
d144108972
@ -90,6 +90,7 @@ static struct smb_Dir *open_dir_safely(TALLOC_CTX *ctx,
|
|||||||
const struct smb_filename *smb_dname,
|
const struct smb_filename *smb_dname,
|
||||||
const char *wcard,
|
const char *wcard,
|
||||||
uint32_t attr);
|
uint32_t attr);
|
||||||
|
static int smb_Dir_destructor(struct smb_Dir *dirp);
|
||||||
|
|
||||||
#define INVALID_DPTR_KEY (-3)
|
#define INVALID_DPTR_KEY (-3)
|
||||||
|
|
||||||
@ -342,6 +343,10 @@ static struct smb_Dir *open_dir_with_privilege(connection_struct *conn,
|
|||||||
|
|
||||||
dir_hnd = open_dir_safely(NULL, conn, smb_fname_cwd, wcard, attr);
|
dir_hnd = open_dir_safely(NULL, conn, smb_fname_cwd, wcard, attr);
|
||||||
|
|
||||||
|
if (dir_hnd != NULL) {
|
||||||
|
talloc_set_destructor(dir_hnd, smb_Dir_destructor);
|
||||||
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
vfs_ChDir(conn, saved_dir_fname);
|
vfs_ChDir(conn, saved_dir_fname);
|
||||||
@ -442,7 +447,13 @@ NTSTATUS dptr_create(connection_struct *conn,
|
|||||||
smb_dname_cp,
|
smb_dname_cp,
|
||||||
wcard,
|
wcard,
|
||||||
attr);
|
attr);
|
||||||
|
if (dir_hnd != NULL) {
|
||||||
|
talloc_set_destructor(dir_hnd,
|
||||||
|
smb_Dir_destructor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TALLOC_FREE(smb_dname_cp);
|
TALLOC_FREE(smb_dname_cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1559,8 +1570,6 @@ static struct smb_Dir *OpenDir_internal(TALLOC_CTX *mem_ctx,
|
|||||||
dirp->name_cache_size = lp_directory_name_cache_size(SNUM(conn));
|
dirp->name_cache_size = lp_directory_name_cache_size(SNUM(conn));
|
||||||
}
|
}
|
||||||
|
|
||||||
talloc_set_destructor(dirp, smb_Dir_destructor);
|
|
||||||
|
|
||||||
return dirp;
|
return dirp;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
@ -1568,9 +1577,36 @@ static struct smb_Dir *OpenDir_internal(TALLOC_CTX *mem_ctx,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/**
|
||||||
Open a directory handle by pathname, ensuring it's under the share path.
|
* @brief Open a directory handle by pathname, ensuring it's under the share path.
|
||||||
****************************************************************************/
|
*
|
||||||
|
* First stores the $cwd, then changes directory to the passed in pathname
|
||||||
|
* uses check_name() to ensure this is under the connection struct share path,
|
||||||
|
* then operates on a pathname of "." to ensure we're in the same place.
|
||||||
|
*
|
||||||
|
* The returned struct smb_Dir * should have a talloc destrctor added to
|
||||||
|
* ensure that when the struct is freed the internal POSIX DIR * pointer
|
||||||
|
* is closed.
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
*
|
||||||
|
* static int sample_smb_Dir_destructor(struct smb_Dir *dirp)
|
||||||
|
* {
|
||||||
|
* SMB_VFS_CLOSEDIR(dirp->conn,dirp->dir);
|
||||||
|
* }
|
||||||
|
* ..
|
||||||
|
* struct smb_Dir *dir_hnd = open_dir_safely(mem_ctx,
|
||||||
|
* conn,
|
||||||
|
* smb_dname,
|
||||||
|
* mask,
|
||||||
|
* attr);
|
||||||
|
* if (dir_hnd == NULL) {
|
||||||
|
* return NULL;
|
||||||
|
* }
|
||||||
|
* talloc_set_destructor(dir_hnd, smb_Dir_destructor);
|
||||||
|
* ..
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
|
||||||
static struct smb_Dir *open_dir_safely(TALLOC_CTX *ctx,
|
static struct smb_Dir *open_dir_safely(TALLOC_CTX *ctx,
|
||||||
connection_struct *conn,
|
connection_struct *conn,
|
||||||
@ -1627,6 +1663,7 @@ static struct smb_Dir *open_dir_safely(TALLOC_CTX *ctx,
|
|||||||
dir_hnd->dir_smb_fname = cp_smb_filename(dir_hnd, smb_dname);
|
dir_hnd->dir_smb_fname = cp_smb_filename(dir_hnd, smb_dname);
|
||||||
if (!dir_hnd->dir_smb_fname) {
|
if (!dir_hnd->dir_smb_fname) {
|
||||||
TALLOC_FREE(dir_hnd);
|
TALLOC_FREE(dir_hnd);
|
||||||
|
SMB_VFS_CLOSEDIR(conn, dir_hnd->dir);
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1642,11 +1679,16 @@ struct smb_Dir *OpenDir(TALLOC_CTX *mem_ctx, connection_struct *conn,
|
|||||||
const char *mask,
|
const char *mask,
|
||||||
uint32_t attr)
|
uint32_t attr)
|
||||||
{
|
{
|
||||||
return open_dir_safely(mem_ctx,
|
struct smb_Dir *dir_hnd = open_dir_safely(mem_ctx,
|
||||||
conn,
|
conn,
|
||||||
smb_dname,
|
smb_dname,
|
||||||
mask,
|
mask,
|
||||||
attr);
|
attr);
|
||||||
|
if (dir_hnd == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
talloc_set_destructor(dir_hnd, smb_Dir_destructor);
|
||||||
|
return dir_hnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
@ -1708,11 +1750,15 @@ static struct smb_Dir *OpenDir_fsp(TALLOC_CTX *mem_ctx, connection_struct *conn,
|
|||||||
if (dirp->dir == NULL) {
|
if (dirp->dir == NULL) {
|
||||||
/* FDOPENDIR is not supported. Use OPENDIR instead. */
|
/* FDOPENDIR is not supported. Use OPENDIR instead. */
|
||||||
TALLOC_FREE(dirp);
|
TALLOC_FREE(dirp);
|
||||||
return open_dir_safely(mem_ctx,
|
dirp = open_dir_safely(mem_ctx,
|
||||||
conn,
|
conn,
|
||||||
fsp->fsp_name,
|
fsp->fsp_name,
|
||||||
mask,
|
mask,
|
||||||
attr);
|
attr);
|
||||||
|
if (dirp == NULL) {
|
||||||
|
errno = ENOMEM;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
talloc_set_destructor(dirp, smb_Dir_destructor);
|
talloc_set_destructor(dirp, smb_Dir_destructor);
|
||||||
|
Loading…
Reference in New Issue
Block a user