summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2022-02-21 17:12:05 +0100
committerRalph Boehme <slow@samba.org>2022-02-22 09:21:29 +0000
commitafd037df1111202adefa49d1b746ec18d522dcd1 (patch)
tree1d6f04c4d8c2760f7de4228129eb2a5ad32d3fa1 /source3
parent2cef24a5fa681840147509e1f97d8ce19e0f533d (diff)
downloadsamba-afd037df1111202adefa49d1b746ec18d522dcd1.tar.gz
smbd: Make OpenDir_fsp() return NTSTATUS
Preparation for making OpenDir return NTSTATUS Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org>
Diffstat (limited to 'source3')
-rw-r--r--source3/smbd/dir.c49
1 files changed, 30 insertions, 19 deletions
diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index 3d8dfde2970..3c1ce7ebc17 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -81,10 +81,13 @@ struct dptr_struct {
struct memcache *dptr_cache;
};
-static struct smb_Dir *OpenDir_fsp(TALLOC_CTX *mem_ctx, connection_struct *conn,
- files_struct *fsp,
- const char *mask,
- uint32_t attr);
+static NTSTATUS OpenDir_fsp(
+ TALLOC_CTX *mem_ctx,
+ connection_struct *conn,
+ files_struct *fsp,
+ const char *mask,
+ uint32_t attr,
+ struct smb_Dir **_dir_hnd);
static void DirCacheAdd(struct smb_Dir *dir_hnd, const char *name, long offset);
@@ -217,6 +220,7 @@ NTSTATUS dptr_create(connection_struct *conn,
struct smbd_server_connection *sconn = conn->sconn;
struct dptr_struct *dptr = NULL;
struct smb_Dir *dir_hnd = NULL;
+ NTSTATUS status;
DBG_INFO("dir=%s\n", fsp_str_dbg(fsp));
@@ -235,9 +239,9 @@ NTSTATUS dptr_create(connection_struct *conn,
fsp_str_dbg(fsp));
return NT_STATUS_ACCESS_DENIED;
}
- dir_hnd = OpenDir_fsp(NULL, conn, fsp, wcard, attr);
- if (!dir_hnd) {
- return map_nt_error_from_unix(errno);
+ status = OpenDir_fsp(NULL, conn, fsp, wcard, attr, &dir_hnd);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
}
dptr = talloc_zero(NULL, struct dptr_struct);
@@ -1493,8 +1497,9 @@ struct smb_Dir *OpenDir(TALLOC_CTX *mem_ctx,
return NULL;
}
- dir_hnd = OpenDir_fsp(mem_ctx, conn, fsp, mask, attr);
- if (dir_hnd == NULL) {
+ status = OpenDir_fsp(mem_ctx, conn, fsp, mask, attr, &dir_hnd);
+ if (!NT_STATUS_IS_OK(status)) {
+ errno = map_errno_from_nt_status(status);
return NULL;
}
@@ -1510,24 +1515,28 @@ struct smb_Dir *OpenDir(TALLOC_CTX *mem_ctx,
Open a directory from an fsp.
********************************************************************/
-static struct smb_Dir *OpenDir_fsp(TALLOC_CTX *mem_ctx, connection_struct *conn,
- files_struct *fsp,
- const char *mask,
- uint32_t attr)
+static NTSTATUS OpenDir_fsp(
+ TALLOC_CTX *mem_ctx,
+ connection_struct *conn,
+ files_struct *fsp,
+ const char *mask,
+ uint32_t attr,
+ struct smb_Dir **_dir_hnd)
{
struct smb_Dir *dir_hnd = talloc_zero(mem_ctx, struct smb_Dir);
+ NTSTATUS status;
if (!dir_hnd) {
- goto fail;
+ return NT_STATUS_NO_MEMORY;
}
if (!fsp->fsp_flags.is_directory) {
- errno = EBADF;
+ status = NT_STATUS_INVALID_HANDLE;
goto fail;
}
if (fsp_get_io_fd(fsp) == -1) {
- errno = EBADF;
+ status = NT_STATUS_INVALID_HANDLE;
goto fail;
}
@@ -1546,12 +1555,13 @@ static struct smb_Dir *OpenDir_fsp(TALLOC_CTX *mem_ctx, connection_struct *conn,
dir_hnd->dir_smb_fname = cp_smb_filename(dir_hnd, fsp->fsp_name);
if (!dir_hnd->dir_smb_fname) {
- errno = ENOMEM;
+ status = NT_STATUS_NO_MEMORY;
goto fail;
}
dir_hnd->dir = SMB_VFS_FDOPENDIR(fsp, mask, attr);
if (dir_hnd->dir == NULL) {
+ status = map_nt_error_from_unix(errno);
goto fail;
}
dir_hnd->fsp = fsp;
@@ -1563,11 +1573,12 @@ static struct smb_Dir *OpenDir_fsp(TALLOC_CTX *mem_ctx, connection_struct *conn,
talloc_set_destructor(dir_hnd, smb_Dir_destructor);
- return dir_hnd;
+ *_dir_hnd = dir_hnd;
+ return NT_STATUS_OK;
fail:
TALLOC_FREE(dir_hnd);
- return NULL;
+ return status;
}