VFS: Add SMB_VFS_FREADDIR_ATTR()
authorSamuel Cabrero <scabrero@samba.org>
Mon, 10 May 2021 10:38:58 +0000 (12:38 +0200)
committerJeremy Allison <jra@samba.org>
Fri, 14 May 2021 20:04:28 +0000 (20:04 +0000)
Signed-off-by: Samuel Cabrero <scabrero@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
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 256ab2a5e415c1d3e1043a34c2cd4ffb282cff0a..781c976b5ddb3ffa40cd2b89eb34ddc92bcc6f15 100644 (file)
@@ -705,6 +705,14 @@ static NTSTATUS skel_readdir_attr(struct vfs_handle_struct *handle,
        return NT_STATUS_NOT_IMPLEMENTED;
 }
 
+static NTSTATUS skel_freaddir_attr(struct vfs_handle_struct *handle,
+                                  struct files_struct *fsp,
+                                  TALLOC_CTX *mem_ctx,
+                                  struct readdir_attr_data **pattr_data)
+{
+       return NT_STATUS_NOT_IMPLEMENTED;
+}
+
 struct skel_get_dos_attributes_state {
        struct vfs_aio_state aio_state;
        uint32_t dosmode;
@@ -1065,6 +1073,7 @@ static struct vfs_fn_pointers skel_opaque_fns = {
        .translate_name_fn = skel_translate_name,
        .fsctl_fn = skel_fsctl,
        .readdir_attr_fn = skel_readdir_attr,
+       .freaddir_attr_fn = skel_freaddir_attr,
        .audit_file_fn = skel_audit_file,
 
        /* DOS attributes. */
index dfb324d52a3b252c9d624bdb80ca70394a59e0ba..f6a66d2b8f9959c5352fa1da3d9be1420748a3d0 100644 (file)
@@ -925,6 +925,14 @@ static NTSTATUS skel_readdir_attr(struct vfs_handle_struct *handle,
        return SMB_VFS_NEXT_READDIR_ATTR(handle, fname, mem_ctx, pattr_data);
 }
 
+static NTSTATUS skel_freaddir_attr(struct vfs_handle_struct *handle,
+                                  struct files_struct *fsp,
+                                  TALLOC_CTX *mem_ctx,
+                                  struct readdir_attr_data **pattr_data)
+{
+       return SMB_VFS_NEXT_FREADDIR_ATTR(handle, fsp, mem_ctx, pattr_data);
+}
+
 struct skel_get_dos_attributes_state {
        struct vfs_aio_state aio_state;
        uint32_t dosmode;
@@ -1370,6 +1378,7 @@ static struct vfs_fn_pointers skel_transparent_fns = {
        .translate_name_fn = skel_translate_name,
        .fsctl_fn = skel_fsctl,
        .readdir_attr_fn = skel_readdir_attr,
+       .freaddir_attr_fn = skel_freaddir_attr,
        .audit_file_fn = skel_audit_file,
 
        /* DOS attributes. */
index 1af6bdec1fe7e9ca3f985925ee09701b86541a78..3382bb9fa2f239ab7f035d5ab4ad4179780ed786 100644 (file)
  * Version 45 - Add SMB_VFS_FNTIMES
  * Version 45 - Remove SMB_VFS_NTIMES
  * Version 45 - ADD SMB_VFS_FSTREAMINFO
+ * Version 45 - Add SMB_VFS_FREADDIR_ATTR
  */
 
 #define SMB_VFS_INTERFACE_VERSION 45
@@ -1273,6 +1274,10 @@ struct vfs_fn_pointers {
                                    const struct smb_filename *fname,
                                    TALLOC_CTX *mem_ctx,
                                    struct readdir_attr_data **attr_data);
+       NTSTATUS (*freaddir_attr_fn)(struct vfs_handle_struct *handle,
+                                    struct files_struct *fsp,
+                                    TALLOC_CTX *mem_ctx,
+                                    struct readdir_attr_data **attr_data);
 };
 
 /*
@@ -1785,6 +1790,10 @@ NTSTATUS smb_vfs_call_readdir_attr(struct vfs_handle_struct *handle,
                                   const struct smb_filename *fname,
                                   TALLOC_CTX *mem_ctx,
                                   struct readdir_attr_data **attr_data);
+NTSTATUS smb_vfs_call_freaddir_attr(struct vfs_handle_struct *handle,
+                                   struct files_struct *fsp,
+                                   TALLOC_CTX *mem_ctx,
+                                   struct readdir_attr_data **attr_data);
 
 NTSTATUS smb_register_vfs(int version, const char *name,
                          const struct vfs_fn_pointers *fns);
@@ -2084,6 +2093,10 @@ NTSTATUS vfs_not_implemented_readdir_attr(struct vfs_handle_struct *handle,
                                          const struct smb_filename *fname,
                                          TALLOC_CTX *mem_ctx,
                                          struct readdir_attr_data **pattr_data);
+NTSTATUS vfs_not_implemented_freaddir_attr(struct vfs_handle_struct *handle,
+                                          struct files_struct *dirfsp,
+                                          TALLOC_CTX *mem_ctx,
+                                          struct readdir_attr_data **pattr_data);
 struct tevent_req *vfs_not_implemented_get_dos_attributes_send(
                        TALLOC_CTX *mem_ctx,
                        struct tevent_context *ev,
index 3769593c2e427a02ab4a195705138f9529f4f707..e0b0423689c72d160cc6f759290b64c54bf40821 100644 (file)
 #define SMB_VFS_NEXT_READDIR_ATTR(conn, fname, mem_ctx, attr_data) \
        smb_vfs_call_readdir_attr((handle)->next, (fname), (mem_ctx), (attr_data))
 
+#define SMB_VFS_FREADDIR_ATTR(fsp, mem_ctx, attr_data) \
+       smb_vfs_call_freaddir_attr((fsp)->conn->vfs_handles, (fsp), (mem_ctx), (attr_data))
+#define SMB_VFS_NEXT_FREADDIR_ATTR(handle, fsp, mem_ctx, attr_data) \
+       smb_vfs_call_freaddir_attr((handle)->next, (fsp), (mem_ctx), (attr_data))
+
 #endif /* _VFS_MACROS_H */
index 27b38f508167d31ec21a4c6fd522284f3c9b2500..7a0992ea6c52be6ec910ba02625ab5103ecf57f7 100644 (file)
@@ -639,6 +639,14 @@ static NTSTATUS vfswrap_readdir_attr(struct vfs_handle_struct *handle,
        return NT_STATUS_NOT_SUPPORTED;
 }
 
+static NTSTATUS vfswrap_freaddir_attr(struct vfs_handle_struct *handle,
+                                     struct files_struct *fsp,
+                                     TALLOC_CTX *mem_ctx,
+                                     struct readdir_attr_data **attr_data)
+{
+       return NT_STATUS_NOT_SUPPORTED;
+}
+
 static void vfswrap_seekdir(vfs_handle_struct *handle, DIR *dirp, long offset)
 {
        START_PROFILE(syscall_seekdir);
@@ -3769,6 +3777,7 @@ static struct vfs_fn_pointers vfs_default_fns = {
        .fdopendir_fn = vfswrap_fdopendir,
        .readdir_fn = vfswrap_readdir,
        .readdir_attr_fn = vfswrap_readdir_attr,
+       .freaddir_attr_fn = vfswrap_freaddir_attr,
        .seekdir_fn = vfswrap_seekdir,
        .telldir_fn = vfswrap_telldir,
        .rewind_dir_fn = vfswrap_rewinddir,
index f1ded4fff04686db011cec353404a63b0dea3d2e..d205faee253d0813cfc081e2c6aba754e61b465e 100644 (file)
@@ -226,6 +226,7 @@ typedef enum _vfs_op_type {
        SMB_VFS_OP_DURABLE_RECONNECT,
 
        SMB_VFS_OP_READDIR_ATTR,
+       SMB_VFS_OP_FREADDIR_ATTR,
 
        /* This should always be last enum value */
 
@@ -348,6 +349,7 @@ static struct {
        { SMB_VFS_OP_DURABLE_DISCONNECT, "durable_disconnect" },
        { SMB_VFS_OP_DURABLE_RECONNECT, "durable_reconnect" },
        { SMB_VFS_OP_READDIR_ATTR,      "readdir_attr" },
+       { SMB_VFS_OP_FREADDIR_ATTR,      "freaddir_attr" },
        { SMB_VFS_OP_LAST, NULL }
 };
 
@@ -2275,6 +2277,24 @@ static NTSTATUS smb_full_audit_readdir_attr(struct vfs_handle_struct *handle,
        return status;
 }
 
+static NTSTATUS smb_full_audit_freaddir_attr(struct vfs_handle_struct *handle,
+                                       struct files_struct *fsp,
+                                       TALLOC_CTX *mem_ctx,
+                                       struct readdir_attr_data **pattr_data)
+{
+       NTSTATUS status;
+
+       status = SMB_VFS_NEXT_FREADDIR_ATTR(handle, fsp, mem_ctx, pattr_data);
+
+       do_log(SMB_VFS_OP_FREADDIR_ATTR,
+              NT_STATUS_IS_OK(status),
+              handle,
+              "%s",
+              fsp_str_do_log(fsp));
+
+       return status;
+}
+
 struct smb_full_audit_get_dos_attributes_state {
        struct vfs_aio_state aio_state;
        vfs_handle_struct *handle;
@@ -3013,8 +3033,8 @@ static struct vfs_fn_pointers vfs_full_audit_fns = {
        .durable_cookie_fn = smb_full_audit_durable_cookie,
        .durable_disconnect_fn = smb_full_audit_durable_disconnect,
        .durable_reconnect_fn = smb_full_audit_durable_reconnect,
-       .readdir_attr_fn = smb_full_audit_readdir_attr
-
+       .readdir_attr_fn = smb_full_audit_readdir_attr,
+       .freaddir_attr_fn = smb_full_audit_freaddir_attr,
 };
 
 static_decl_vfs;
index c4722c3687d969c31afd31e25da73762dc67c2e3..257cbd6e7d716f00afb6f72df4f9673519452585 100644 (file)
@@ -708,6 +708,14 @@ NTSTATUS vfs_not_implemented_readdir_attr(struct vfs_handle_struct *handle,
        return NT_STATUS_NOT_IMPLEMENTED;
 }
 
+NTSTATUS vfs_not_implemented_freaddir_attr(struct vfs_handle_struct *handle,
+                                       struct files_struct *fsp,
+                                       TALLOC_CTX *mem_ctx,
+                                       struct readdir_attr_data **pattr_data)
+{
+       return NT_STATUS_NOT_IMPLEMENTED;
+}
+
 struct vfs_not_implemented_get_dos_attributes_state {
        struct vfs_aio_state aio_state;
        uint32_t dosmode;
@@ -1069,6 +1077,7 @@ static struct vfs_fn_pointers vfs_not_implemented_fns = {
        .translate_name_fn = vfs_not_implemented_translate_name,
        .fsctl_fn = vfs_not_implemented_fsctl,
        .readdir_attr_fn = vfs_not_implemented_readdir_attr,
+       .freaddir_attr_fn = vfs_not_implemented_freaddir_attr,
        .audit_file_fn = vfs_not_implemented_audit_file,
 
        /* DOS attributes. */
index 7cd9bf0ae25a6d345a962f33fdc1184fa26720c6..1115d1cc076c3d596355ca045da4da062e8f9cc6 100644 (file)
@@ -2215,6 +2215,27 @@ static NTSTATUS smb_time_audit_readdir_attr(struct vfs_handle_struct *handle,
        return status;
 }
 
+static NTSTATUS smb_time_audit_freaddir_attr(struct vfs_handle_struct *handle,
+                                       struct files_struct *fsp,
+                                       TALLOC_CTX *mem_ctx,
+                                       struct readdir_attr_data **pattr_data)
+{
+       NTSTATUS status;
+       struct timespec ts1, ts2;
+       double timediff;
+
+       clock_gettime_mono(&ts1);
+       status = SMB_VFS_NEXT_FREADDIR_ATTR(handle, fsp, mem_ctx, pattr_data);
+       clock_gettime_mono(&ts2);
+       timediff = nsec_time_diff(&ts2, &ts1) * 1.0e-9;
+
+       if (timediff > audit_timeout) {
+               smb_time_audit_log_fsp("freaddir_attr", timediff, fsp);
+       }
+
+       return status;
+}
+
 static NTSTATUS smb_time_audit_fget_nt_acl(vfs_handle_struct *handle,
                                           files_struct *fsp,
                                           uint32_t security_info,
@@ -2849,6 +2870,7 @@ static struct vfs_fn_pointers vfs_time_audit_fns = {
        .durable_disconnect_fn = smb_time_audit_durable_disconnect,
        .durable_reconnect_fn = smb_time_audit_durable_reconnect,
        .readdir_attr_fn = smb_time_audit_readdir_attr,
+       .freaddir_attr_fn = smb_time_audit_freaddir_attr,
 };
 
 
index 7b91499dc2cfd91f7293cf034f3cf9b363a7386c..15f989b43ee571017f0810ed280b963a68969984 100644 (file)
@@ -2986,3 +2986,15 @@ NTSTATUS smb_vfs_call_readdir_attr(struct vfs_handle_struct *handle,
        VFS_FIND(readdir_attr);
        return handle->fns->readdir_attr_fn(handle, fname, mem_ctx, attr_data);
 }
+
+NTSTATUS smb_vfs_call_freaddir_attr(struct vfs_handle_struct *handle,
+                                   struct files_struct *fsp,
+                                   TALLOC_CTX *mem_ctx,
+                                   struct readdir_attr_data **attr_data)
+{
+       VFS_FIND(freaddir_attr);
+       return handle->fns->freaddir_attr_fn(handle,
+                                            fsp,
+                                            mem_ctx,
+                                            attr_data);
+}