From: Samuel Cabrero Date: Mon, 10 May 2021 10:38:58 +0000 (+0200) Subject: VFS: Add SMB_VFS_FREADDIR_ATTR() X-Git-Tag: tevent-0.11.0~881 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6df8709fc9879049e95176f72193aa255e1b1452;p=thirdparty%2Fsamba.git VFS: Add SMB_VFS_FREADDIR_ATTR() Signed-off-by: Samuel Cabrero Reviewed-by: Jeremy Allison --- diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c index 256ab2a5e41..781c976b5dd 100644 --- a/examples/VFS/skel_opaque.c +++ b/examples/VFS/skel_opaque.c @@ -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. */ diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c index dfb324d52a3..f6a66d2b8f9 100644 --- a/examples/VFS/skel_transparent.c +++ b/examples/VFS/skel_transparent.c @@ -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. */ diff --git a/source3/include/vfs.h b/source3/include/vfs.h index 1af6bdec1fe..3382bb9fa2f 100644 --- a/source3/include/vfs.h +++ b/source3/include/vfs.h @@ -350,6 +350,7 @@ * 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, diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h index 3769593c2e4..e0b0423689c 100644 --- a/source3/include/vfs_macros.h +++ b/source3/include/vfs_macros.h @@ -592,4 +592,9 @@ #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 */ diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 27b38f50816..7a0992ea6c5 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -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, diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c index f1ded4fff04..d205faee253 100644 --- a/source3/modules/vfs_full_audit.c +++ b/source3/modules/vfs_full_audit.c @@ -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; diff --git a/source3/modules/vfs_not_implemented.c b/source3/modules/vfs_not_implemented.c index c4722c3687d..257cbd6e7d7 100644 --- a/source3/modules/vfs_not_implemented.c +++ b/source3/modules/vfs_not_implemented.c @@ -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. */ diff --git a/source3/modules/vfs_time_audit.c b/source3/modules/vfs_time_audit.c index 7cd9bf0ae25..1115d1cc076 100644 --- a/source3/modules/vfs_time_audit.c +++ b/source3/modules/vfs_time_audit.c @@ -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, }; diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index 7b91499dc2c..15f989b43ee 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -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); +}