diff mbox series

[-next] fuse: Conditionally fill kstat in fuse_do_statx

Message ID 20230823223345.2775761-1-bschubert@ddn.com (mailing list archive)
State New, archived
Headers show
Series [-next] fuse: Conditionally fill kstat in fuse_do_statx | expand

Commit Message

Bernd Schubert Aug. 23, 2023, 10:33 p.m. UTC
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>
Cc: Miklos Szeredi <miklos@szeredi.hu>
Cc: Dharmendra Singh <dsingh@ddn.com>
Cc: linux-fsdevel@vger.kernel.org
---
 fs/fuse/dir.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

Comments

Miklos Szeredi Aug. 29, 2023, 1:01 p.m. UTC | #1
On Thu, 24 Aug 2023 at 00:34, Bernd Schubert <bschubert@ddn.com> wrote:
>
> 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>

Applied, thanks.

Miklos
diff mbox series

Patch

diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index e190d09f220d..01e78d746338 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -1219,11 +1219,15 @@  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;
 }