s3: VFS: Add SMB_VFS_SYS_ACL_DELETE_DEF_FD(),
authorJeremy Allison <jra@samba.org>
Fri, 14 May 2021 21:20:50 +0000 (14:20 -0700)
committerJeremy Allison <jra@samba.org>
Tue, 18 May 2021 17:29:34 +0000 (17:29 +0000)
Not yet used. Eventually will replace SMB_VFS_SYS_ACL_DELETE_DEF_FILE().

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Noel Power <noel.power@suse.com>
examples/VFS/skel_opaque.c
examples/VFS/skel_transparent.c
source3/include/vfs.h
source3/include/vfs_macros.h
source3/modules/vfs_default.c
source3/modules/vfs_full_audit.c
source3/modules/vfs_not_implemented.c
source3/modules/vfs_time_audit.c
source3/smbd/vfs.c

index bb98c001d25fe60b2deadea4ec76a4292e8e6e7b..b5d61654c4a180eac75520a108d9ed1743856323 100644 (file)
@@ -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,
index 4811bad3b2cd25796614224be484f4d78d36410c..53ac83ca40812a22b2cfd5b35ea0e4cd21c993a7 100644 (file)
@@ -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,
index 1c076c2c8f6b2c3bef48e3e5c3e5f83becc3b613..885fbf7de613c6834d363eca96f86d84fda7289a 100644 (file)
  * 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,
index 0f69dcc930f1b8d00ec7943518c1583008b6d129..3573be5fb4c9559a710df83ed38370d0419fd03d 100644 (file)
 #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) \
index 722a3424c3188762d0cdfa4f027bb37a7161991f..90bfe0f08a06d32aeaac20bb85d660594181cd94 100644 (file)
@@ -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,
index 508ef491af3c7cfc7f0cb55be00776bde9a09d9e..1e7a59d361c8d233039c6e3b1849888793de25a9 100644 (file)
@@ -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,
index b4139644fef79226dc6dcb14991af0db89b2c89e..09ddcb00876f55fe472f8b022f82e7469996bec1 100644 (file)
@@ -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,
index 972fec54564572b7bee185936fd8eff213c58e95..0587683a3ca8eb11afc5f09c51d083c3b8e40ac0 100644 (file)
@@ -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,
index 67a2e67f12416a6fac0ad282ff771a36aedc8a04..19744dfa39c8d34b2de74eb19a8a0a76d444537a 100644 (file)
@@ -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,