]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: VFS: shadow_copy2. Add shadow_copy2_get_nt_acl_at().
authorJeremy Allison <jra@samba.org>
Mon, 13 Apr 2020 21:05:03 +0000 (14:05 -0700)
committerJeremy Allison <jra@samba.org>
Thu, 7 May 2020 19:27:35 +0000 (19:27 +0000)
Not yet used.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/modules/vfs_shadow_copy2.c

index 5a9074e802b3766dfc1ad11c28b36817e287f609..18eb0704d67446493fb49497c98c66a2d82a0c68 100644 (file)
@@ -2138,6 +2138,60 @@ static NTSTATUS shadow_copy2_get_nt_acl(vfs_handle_struct *handle,
        return status;
 }
 
+static NTSTATUS shadow_copy2_get_nt_acl_at(vfs_handle_struct *handle,
+                                       struct files_struct *dirfsp,
+                                       const struct smb_filename *smb_fname,
+                                       uint32_t security_info,
+                                       TALLOC_CTX *mem_ctx,
+                                       struct security_descriptor **ppdesc)
+{
+       time_t timestamp = 0;
+       char *stripped = NULL;
+       NTSTATUS status;
+       char *conv;
+       struct smb_filename *conv_smb_fname = NULL;
+
+       if (!shadow_copy2_strip_snapshot(talloc_tos(),
+                                       handle,
+                                       smb_fname,
+                                       &timestamp,
+                                       &stripped)) {
+               return map_nt_error_from_unix(errno);
+       }
+       if (timestamp == 0) {
+               return SMB_VFS_NEXT_GET_NT_ACL_AT(handle,
+                                       dirfsp,
+                                       smb_fname,
+                                       security_info,
+                                       mem_ctx,
+                                       ppdesc);
+       }
+       conv = shadow_copy2_convert(talloc_tos(), handle, stripped, timestamp);
+       TALLOC_FREE(stripped);
+       if (conv == NULL) {
+               return map_nt_error_from_unix(errno);
+       }
+       conv_smb_fname = synthetic_smb_fname(talloc_tos(),
+                                       conv,
+                                       NULL,
+                                       NULL,
+                                       0,
+                                       smb_fname->flags);
+       if (conv_smb_fname == NULL) {
+               TALLOC_FREE(conv);
+               return NT_STATUS_NO_MEMORY;
+       }
+       status = SMB_VFS_NEXT_GET_NT_ACL_AT(handle,
+                                       dirfsp,
+                                       conv_smb_fname,
+                                       security_info,
+                                       mem_ctx,
+                                       ppdesc);
+       TALLOC_FREE(conv);
+       TALLOC_FREE(conv_smb_fname);
+       return status;
+}
+
 static int shadow_copy2_mkdirat(vfs_handle_struct *handle,
                                struct files_struct *dirfsp,
                                const struct smb_filename *smb_fname,
@@ -3160,6 +3214,7 @@ static struct vfs_fn_pointers vfs_shadow_copy2_fns = {
        .mknodat_fn = shadow_copy2_mknodat,
        .realpath_fn = shadow_copy2_realpath,
        .get_nt_acl_fn = shadow_copy2_get_nt_acl,
+       .get_nt_acl_at_fn = shadow_copy2_get_nt_acl_at,
        .get_shadow_copy_data_fn = shadow_copy2_get_shadow_copy_data,
        .mkdirat_fn = shadow_copy2_mkdirat,
        .getxattr_fn = shadow_copy2_getxattr,