summaryrefslogtreecommitdiffstats
path: root/fs/fuse/dir.c
diff options
context:
space:
mode:
authorBernd Schubert <bschubert@ddn.com>2023-08-24 00:33:45 +0200
committerMiklos Szeredi <mszeredi@redhat.com>2023-08-29 14:58:48 +0200
commitf73016b63b09edec8adf7e182600c52465c56ee7 (patch)
tree6c661ed93167609141888cae56a5d44e3933bfb2 /fs/fuse/dir.c
parent7d875e66859a4359acd29ce0d188e1aff048e7ed (diff)
downloadlinux-f73016b63b09edec8adf7e182600c52465c56ee7.tar.gz
linux-f73016b63b09edec8adf7e182600c52465c56ee7.tar.bz2
linux-f73016b63b09edec8adf7e182600c52465c56ee7.zip
fuse: conditionally fill kstat in fuse_do_statx()
The code path fuse_update_attributes fuse_update_get_attr fuse_do_statx has the risk to use a NULL pointer for struct kstat *stat, although current callers of fuse_update_attributes() only set request_mask to values that will trigger the call of fuse_do_getattr(), which already handles the NULL pointer. Future updates might miss that fuse_do_statx() does not handle it it is safer to add a condition already right now. Signed-off-by: Bernd Schubert <bschubert@ddn.com> Fixes: d3045530bdd2 ("fuse: implement statx") Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/fuse/dir.c')
-rw-r--r--fs/fuse/dir.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index e190d09f220d..04a1c62342dc 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -1219,11 +1219,14 @@ static int fuse_do_statx(struct inode *inode, struct file *file,
fuse_change_attributes(inode, &attr, &outarg.stat,
ATTR_TIMEOUT(&outarg), attr_version);
}
- stat->result_mask = sx->mask & (STATX_BASIC_STATS | STATX_BTIME);
- stat->btime.tv_sec = sx->btime.tv_sec;
- stat->btime.tv_nsec = min_t(u32, sx->btime.tv_nsec, NSEC_PER_SEC - 1);
- fuse_fillattr(inode, &attr, stat);
- stat->result_mask |= STATX_TYPE;
+
+ if (stat) {
+ stat->result_mask = sx->mask & (STATX_BASIC_STATS | STATX_BTIME);
+ stat->btime.tv_sec = sx->btime.tv_sec;
+ stat->btime.tv_nsec = min_t(u32, sx->btime.tv_nsec, NSEC_PER_SEC - 1);
+ fuse_fillattr(inode, &attr, stat);
+ stat->result_mask |= STATX_TYPE;
+ }
return 0;
}