]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: Factor out can_delete_directory_hnd()
authorVolker Lendecke <vl@samba.org>
Thu, 5 Dec 2024 16:17:59 +0000 (17:17 +0100)
committerVolker Lendecke <vl@samba.org>
Tue, 17 Dec 2024 12:30:31 +0000 (12:30 +0000)
To be used in close.c next

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Pavel Filipenský <pfilipensky@samba.org>
source3/smbd/dir.c
source3/smbd/dir.h

index 7cf79222c2f961dabfc9cece3a0409422e456e71..afc9c74dfddbd928b35b1a8d00a59249ca6e1035 100644 (file)
@@ -1539,21 +1539,14 @@ bool opens_below_forall(struct connection_struct *conn,
  Is this directory empty ?
 *****************************************************************/
 
-NTSTATUS can_delete_directory_fsp(files_struct *fsp)
+NTSTATUS can_delete_directory_hnd(struct smb_Dir *dir_hnd)
 {
        NTSTATUS status = NT_STATUS_OK;
        const char *dname = NULL;
        char *talloced = NULL;
-       struct connection_struct *conn = fsp->conn;
+       struct files_struct *dirfsp = dir_hnd_fetch_fsp(dir_hnd);
+       struct connection_struct *conn = dirfsp->conn;
        bool delete_veto = lp_delete_veto_files(SNUM(conn));
-       struct smb_Dir *dir_hnd = NULL;
-       struct files_struct *dirfsp = NULL;
-
-       status = OpenDir_from_pathref(talloc_tos(), fsp, NULL, 0, &dir_hnd);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
-       dirfsp = dir_hnd_fetch_fsp(dir_hnd);
 
        while ((dname = ReadDirName(dir_hnd, &talloced))) {
                struct smb_filename *direntry_fname = NULL;
@@ -1658,15 +1651,26 @@ NTSTATUS can_delete_directory_fsp(files_struct *fsp)
        }
 
        if (!NT_STATUS_IS_OK(status)) {
-               TALLOC_FREE(dir_hnd);
                return status;
        }
 
        if (have_file_open_below(dirfsp)) {
-               TALLOC_FREE(dir_hnd);
                return NT_STATUS_ACCESS_DENIED;
        }
 
-       TALLOC_FREE(dir_hnd);
        return NT_STATUS_OK;
 }
+
+NTSTATUS can_delete_directory_fsp(files_struct *fsp)
+{
+       struct smb_Dir *dir_hnd = NULL;
+       NTSTATUS status;
+
+       status = OpenDir_from_pathref(talloc_tos(), fsp, NULL, 0, &dir_hnd);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+       status = can_delete_directory_hnd(dir_hnd);
+       TALLOC_FREE(dir_hnd);
+       return status;
+}
index 21e4632eb632102da3e0ac7d7e5b32ae10e867bd..5cfe9e37f136d01dc7ed500bc81dbbe12e5de1e8 100644 (file)
@@ -23,6 +23,7 @@
 struct smb_Dir;
 struct dptr_struct;
 
+NTSTATUS can_delete_directory_hnd(struct smb_Dir *dir_hnd);
 NTSTATUS can_delete_directory_fsp(files_struct *fsp);
 struct files_struct *dir_hnd_fetch_fsp(struct smb_Dir *dir_hnd);
 uint16_t dptr_attr(struct smbd_server_connection *sconn, int key);