Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit 6630036

Browse files
committed
fs/9p: fix uninitialized values during inode evict
If an iget fails due to not being able to retrieve information from the server then the inode structure is only partially initialized. When the inode gets evicted, references to uninitialized structures (like fscache cookies) were being made. This patch checks for a bad_inode before doing anything other than clearing the inode from the cache. Since the inode is bad, it shouldn't have any state associated with it that needs to be written back (and there really isn't a way to complete those anyways). Reported-by: syzbot+eb83fe1cce5833cd66a0@syzkaller.appspotmail.com Signed-off-by: Eric Van Hensbergen <ericvh@kernel.org>
1 parent 10211b4 commit 6630036

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

fs/9p/vfs_inode.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -344,17 +344,21 @@ void v9fs_evict_inode(struct inode *inode)
344344
struct v9fs_inode __maybe_unused *v9inode = V9FS_I(inode);
345345
__le32 __maybe_unused version;
346346

347-
truncate_inode_pages_final(&inode->i_data);
347+
if (!is_bad_inode(inode)) {
348+
truncate_inode_pages_final(&inode->i_data);
348349

349-
version = cpu_to_le32(v9inode->qid.version);
350-
netfs_clear_inode_writeback(inode, &version);
350+
version = cpu_to_le32(v9inode->qid.version);
351+
netfs_clear_inode_writeback(inode, &version);
351352

352-
clear_inode(inode);
353-
filemap_fdatawrite(&inode->i_data);
353+
clear_inode(inode);
354+
filemap_fdatawrite(&inode->i_data);
354355

355356
#ifdef CONFIG_9P_FSCACHE
356-
fscache_relinquish_cookie(v9fs_inode_cookie(v9inode), false);
357+
if (v9fs_inode_cookie(v9inode))
358+
fscache_relinquish_cookie(v9fs_inode_cookie(v9inode), false);
357359
#endif
360+
} else
361+
clear_inode(inode);
358362
}
359363

360364
struct inode *v9fs_fid_iget(struct super_block *sb, struct p9_fid *fid)

0 commit comments

Comments
 (0)