From 7127cba145973ede5f64b5d8b49ab29a79f230b7 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 14 May 2021 14:20:50 -0700 Subject: [PATCH] s3: VFS: Add SMB_VFS_SYS_ACL_DELETE_DEF_FD(), Not yet used. Eventually will replace SMB_VFS_SYS_ACL_DELETE_DEF_FILE(). Signed-off-by: Jeremy Allison Reviewed-by: Noel Power --- examples/VFS/skel_opaque.c | 8 ++++++++ examples/VFS/skel_transparent.c | 7 +++++++ source3/include/vfs.h | 7 +++++++ source3/include/vfs_macros.h | 5 +++++ source3/modules/vfs_default.c | 13 +++++++++++++ source3/modules/vfs_full_audit.c | 19 +++++++++++++++++++ source3/modules/vfs_not_implemented.c | 8 ++++++++ source3/modules/vfs_time_audit.c | 20 ++++++++++++++++++++ source3/smbd/vfs.c | 7 +++++++ 9 files changed, 94 insertions(+) diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c index bb98c001d25..b5d61654c4a 100644 --- a/examples/VFS/skel_opaque.c +++ b/examples/VFS/skel_opaque.c @@ -839,6 +839,13 @@ static int skel_sys_acl_delete_def_file(vfs_handle_struct *handle, return -1; } +static int skel_sys_acl_delete_def_fd(vfs_handle_struct *handle, + struct files_struct *fsp) +{ + errno = ENOSYS; + return -1; +} + static ssize_t skel_getxattr(vfs_handle_struct *handle, const struct smb_filename *smb_fname, const char *name, @@ -1087,6 +1094,7 @@ static struct vfs_fn_pointers skel_opaque_fns = { .sys_acl_blob_get_fd_fn = skel_sys_acl_blob_get_fd, .sys_acl_set_fd_fn = skel_sys_acl_set_fd, .sys_acl_delete_def_file_fn = skel_sys_acl_delete_def_file, + .sys_acl_delete_def_fd_fn = skel_sys_acl_delete_def_fd, /* EA operations. */ .getxattr_fn = skel_getxattr, diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c index 4811bad3b2c..53ac83ca408 100644 --- a/examples/VFS/skel_transparent.c +++ b/examples/VFS/skel_transparent.c @@ -1099,6 +1099,12 @@ static int skel_sys_acl_delete_def_file(vfs_handle_struct *handle, return SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, smb_fname); } +static int skel_sys_acl_delete_def_fd(vfs_handle_struct *handle, + struct files_struct *fsp) +{ + return SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FD(handle, fsp); +} + static ssize_t skel_getxattr(vfs_handle_struct *handle, const struct smb_filename *smb_fname, const char *name, @@ -1392,6 +1398,7 @@ static struct vfs_fn_pointers skel_transparent_fns = { .sys_acl_blob_get_fd_fn = skel_sys_acl_blob_get_fd, .sys_acl_set_fd_fn = skel_sys_acl_set_fd, .sys_acl_delete_def_file_fn = skel_sys_acl_delete_def_file, + .sys_acl_delete_def_fd_fn = skel_sys_acl_delete_def_fd, /* EA operations. */ .getxattr_fn = skel_getxattr, diff --git a/source3/include/vfs.h b/source3/include/vfs.h index 1c076c2c8f6..885fbf7de61 100644 --- a/source3/include/vfs.h +++ b/source3/include/vfs.h @@ -352,6 +352,7 @@ * Version 45 - ADD SMB_VFS_FSTREAMINFO * Version 45 - Add SMB_VFS_FREADDIR_ATTR * Version 45 - Remove SMB_VFS_READDIR_ATTR + * Version 45 - Add SMB_VFS_SYS_ACL_DELETE_DEF_FD */ #define SMB_VFS_INTERFACE_VERSION 45 @@ -1226,6 +1227,8 @@ struct vfs_fn_pointers { SMB_ACL_T theacl); int (*sys_acl_delete_def_file_fn)(struct vfs_handle_struct *handle, const struct smb_filename *smb_fname); + int (*sys_acl_delete_def_fd_fn)(struct vfs_handle_struct *handle, + struct files_struct *fsp); /* EA operations. */ ssize_t (*getxattr_fn)(struct vfs_handle_struct *handle, @@ -1734,6 +1737,8 @@ int smb_vfs_call_sys_acl_set_fd(struct vfs_handle_struct *handle, SMB_ACL_T theacl); int smb_vfs_call_sys_acl_delete_def_file(struct vfs_handle_struct *handle, const struct smb_filename *smb_fname); +int smb_vfs_call_sys_acl_delete_def_fd(struct vfs_handle_struct *handle, + struct files_struct *fsp); ssize_t smb_vfs_call_getxattr(struct vfs_handle_struct *handle, const struct smb_filename *smb_fname, const char *name, @@ -2138,6 +2143,8 @@ int vfs_not_implemented_sys_acl_set_fd(vfs_handle_struct *handle, SMB_ACL_T theacl); int vfs_not_implemented_sys_acl_delete_def_file(vfs_handle_struct *handle, const struct smb_filename *smb_fname); +int vfs_not_implemented_sys_acl_delete_def_fd(vfs_handle_struct *handle, + files_struct *fsp); ssize_t vfs_not_implemented_getxattr(vfs_handle_struct *handle, const struct smb_filename *smb_fname, const char *name, diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h index 0f69dcc930f..3573be5fb4c 100644 --- a/source3/include/vfs_macros.h +++ b/source3/include/vfs_macros.h @@ -514,6 +514,11 @@ #define SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, smb_fname) \ smb_vfs_call_sys_acl_delete_def_file((handle)->next, (smb_fname)) +#define SMB_VFS_SYS_ACL_DELETE_DEF_FD(fsp) \ + smb_vfs_call_sys_acl_delete_def_fd((fsp)->conn->vfs_handles, (fsp)) +#define SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FD(handle, fsp) \ + smb_vfs_call_sys_acl_delete_def_fd((handle)->next, (fsp)) + #define SMB_VFS_GETXATTR(conn,smb_fname,name,value,size) \ smb_vfs_call_getxattr((conn)->vfs_handles,(smb_fname),(name),(value),(size)) #define SMB_VFS_NEXT_GETXATTR(handle,smb_fname,name,value,size) \ diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 722a3424c31..90bfe0f08a0 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -3241,6 +3241,18 @@ static int vfswrap_sys_acl_delete_def_file(vfs_handle_struct *handle, return sys_acl_delete_def_file(handle, smb_fname); } +static int vfswrap_sys_acl_delete_def_fd(vfs_handle_struct *handle, + files_struct *fsp) +{ + /* Placeholder until we have sys_acl_delete_def_fd(). */ +#ifdef ENOTSUP + errno = ENOTSUP; +#else + errno = ENOSYS; +#endif + return -1; +} + /**************************************************************** Extended attribute operations. *****************************************************************/ @@ -3852,6 +3864,7 @@ static struct vfs_fn_pointers vfs_default_fns = { .sys_acl_blob_get_fd_fn = posix_sys_acl_blob_get_fd, .sys_acl_set_fd_fn = vfswrap_sys_acl_set_fd, .sys_acl_delete_def_file_fn = vfswrap_sys_acl_delete_def_file, + .sys_acl_delete_def_fd_fn = vfswrap_sys_acl_delete_def_fd, /* EA operations. */ .getxattr_fn = vfswrap_getxattr, diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c index 508ef491af3..1e7a59d361c 100644 --- a/source3/modules/vfs_full_audit.c +++ b/source3/modules/vfs_full_audit.c @@ -202,6 +202,7 @@ typedef enum _vfs_op_type { SMB_VFS_OP_SYS_ACL_BLOB_GET_FD, SMB_VFS_OP_SYS_ACL_SET_FD, SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE, + SMB_VFS_OP_SYS_ACL_DELETE_DEF_FD, /* EA operations. */ SMB_VFS_OP_GETXATTR, @@ -333,6 +334,7 @@ static struct { { SMB_VFS_OP_SYS_ACL_BLOB_GET_FD, "sys_acl_blob_get_fd" }, { SMB_VFS_OP_SYS_ACL_SET_FD, "sys_acl_set_fd" }, { SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE, "sys_acl_delete_def_file" }, + { SMB_VFS_OP_SYS_ACL_DELETE_DEF_FD, "sys_acl_delete_def_fd" }, { SMB_VFS_OP_GETXATTR, "getxattr" }, { SMB_VFS_OP_GETXATTRAT_SEND, "getxattrat_send" }, { SMB_VFS_OP_GETXATTRAT_RECV, "getxattrat_recv" }, @@ -2626,6 +2628,22 @@ static int smb_full_audit_sys_acl_delete_def_file(vfs_handle_struct *handle, return result; } +static int smb_full_audit_sys_acl_delete_def_fd(vfs_handle_struct *handle, + struct files_struct *fsp) +{ + int result; + + result = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FD(handle, fsp); + + do_log(SMB_VFS_OP_SYS_ACL_DELETE_DEF_FD, + (result >= 0), + handle, + "%s", + fsp_str_do_log(fsp)); + + return result; +} + static ssize_t smb_full_audit_getxattr(struct vfs_handle_struct *handle, const struct smb_filename *smb_fname, const char *name, void *value, size_t size) @@ -3005,6 +3023,7 @@ static struct vfs_fn_pointers vfs_full_audit_fns = { .sys_acl_blob_get_fd_fn = smb_full_audit_sys_acl_blob_get_fd, .sys_acl_set_fd_fn = smb_full_audit_sys_acl_set_fd, .sys_acl_delete_def_file_fn = smb_full_audit_sys_acl_delete_def_file, + .sys_acl_delete_def_fd_fn = smb_full_audit_sys_acl_delete_def_fd, .getxattr_fn = smb_full_audit_getxattr, .getxattrat_send_fn = smb_full_audit_getxattrat_send, .getxattrat_recv_fn = smb_full_audit_getxattrat_recv, diff --git a/source3/modules/vfs_not_implemented.c b/source3/modules/vfs_not_implemented.c index b4139644fef..09ddcb00876 100644 --- a/source3/modules/vfs_not_implemented.c +++ b/source3/modules/vfs_not_implemented.c @@ -843,6 +843,13 @@ int vfs_not_implemented_sys_acl_delete_def_file(vfs_handle_struct *handle, return -1; } +int vfs_not_implemented_sys_acl_delete_def_fd(vfs_handle_struct *handle, + struct files_struct *fsp) +{ + errno = ENOSYS; + return -1; +} + ssize_t vfs_not_implemented_getxattr(vfs_handle_struct *handle, const struct smb_filename *smb_fname, const char *name, @@ -1091,6 +1098,7 @@ static struct vfs_fn_pointers vfs_not_implemented_fns = { .sys_acl_blob_get_fd_fn = vfs_not_implemented_sys_acl_blob_get_fd, .sys_acl_set_fd_fn = vfs_not_implemented_sys_acl_set_fd, .sys_acl_delete_def_file_fn = vfs_not_implemented_sys_acl_delete_def_file, + .sys_acl_delete_def_fd_fn = vfs_not_implemented_sys_acl_delete_def_fd, /* EA operations. */ .getxattr_fn = vfs_not_implemented_getxattr, diff --git a/source3/modules/vfs_time_audit.c b/source3/modules/vfs_time_audit.c index 972fec54564..0587683a3ca 100644 --- a/source3/modules/vfs_time_audit.c +++ b/source3/modules/vfs_time_audit.c @@ -2448,6 +2448,25 @@ static int smb_time_audit_sys_acl_delete_def_file(vfs_handle_struct *handle, return result; } +static int smb_time_audit_sys_acl_delete_def_fd(vfs_handle_struct *handle, + files_struct *fsp) +{ + int result; + struct timespec ts1,ts2; + double timediff; + + clock_gettime_mono(&ts1); + result = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FD(handle, fsp); + clock_gettime_mono(&ts2); + timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9; + + if (timediff > audit_timeout) { + smb_time_audit_log_fsp("sys_acl_delete_def_fd", timediff, fsp); + } + + return result; +} + static ssize_t smb_time_audit_getxattr(struct vfs_handle_struct *handle, const struct smb_filename *smb_fname, const char *name, @@ -2837,6 +2856,7 @@ static struct vfs_fn_pointers vfs_time_audit_fns = { .sys_acl_blob_get_fd_fn = smb_time_audit_sys_acl_blob_get_fd, .sys_acl_set_fd_fn = smb_time_audit_sys_acl_set_fd, .sys_acl_delete_def_file_fn = smb_time_audit_sys_acl_delete_def_file, + .sys_acl_delete_def_fd_fn = smb_time_audit_sys_acl_delete_def_fd, .getxattr_fn = smb_time_audit_getxattr, .getxattrat_send_fn = smb_time_audit_getxattrat_send, .getxattrat_recv_fn = smb_time_audit_getxattrat_recv, diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index 67a2e67f124..19744dfa39c 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -2789,6 +2789,13 @@ int smb_vfs_call_sys_acl_delete_def_file(struct vfs_handle_struct *handle, return handle->fns->sys_acl_delete_def_file_fn(handle, smb_fname); } +int smb_vfs_call_sys_acl_delete_def_fd(struct vfs_handle_struct *handle, + struct files_struct *fsp) +{ + VFS_FIND(sys_acl_delete_def_fd); + return handle->fns->sys_acl_delete_def_fd_fn(handle, fsp); +} + ssize_t smb_vfs_call_getxattr(struct vfs_handle_struct *handle, const struct smb_filename *smb_fname, const char *name, -- 2.11.4.GIT