]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
fuse: zero initialize inode private data
authorMiklos Szeredi <mszeredi@redhat.com>
Tue, 19 Aug 2025 14:44:02 +0000 (16:44 +0200)
committerMiklos Szeredi <mszeredi@redhat.com>
Wed, 27 Aug 2025 12:29:44 +0000 (14:29 +0200)
This is slightly tricky, since the VFS uses non-zeroing allocation to
preserve some fields that are left in a consistent state.

Reported-by: Chunsheng Luo <luochunsheng@ustc.edu>
Closes: https://lore.kernel.org/all/20250818083224.229-1-luochunsheng@ustc.edu/
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/fuse/inode.c

index 19fc58cb84dc1c8eb0211e7d4c138bc413401036..9d26a5bc394d4a4db51c62c8cbbcef2f8dd54370 100644 (file)
@@ -101,14 +101,11 @@ static struct inode *fuse_alloc_inode(struct super_block *sb)
        if (!fi)
                return NULL;
 
-       fi->i_time = 0;
+       /* Initialize private data (i.e. everything except fi->inode) */
+       BUILD_BUG_ON(offsetof(struct fuse_inode, inode) != 0);
+       memset((void *) fi + sizeof(fi->inode), 0, sizeof(*fi) - sizeof(fi->inode));
+
        fi->inval_mask = ~0;
-       fi->nodeid = 0;
-       fi->nlookup = 0;
-       fi->attr_version = 0;
-       fi->orig_ino = 0;
-       fi->state = 0;
-       fi->submount_lookup = NULL;
        mutex_init(&fi->mutex);
        spin_lock_init(&fi->lock);
        fi->forget = fuse_alloc_forget();