diff options
author | Chao Yu <chao@kernel.org> | 2024-05-21 14:23:18 +0800 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2024-06-12 15:46:02 +0000 |
commit | c240c87bcd44a1a2375fc8ef8c645d1f1fe76466 (patch) | |
tree | 008aabf5b080ca2c9e46774a332b8153331daf39 /fs/f2fs/inline.c | |
parent | fc01008c92f40015aeeced94750855a7111b6929 (diff) | |
download | linux-c240c87bcd44a1a2375fc8ef8c645d1f1fe76466.tar.gz linux-c240c87bcd44a1a2375fc8ef8c645d1f1fe76466.tar.bz2 linux-c240c87bcd44a1a2375fc8ef8c645d1f1fe76466.zip |
f2fs: fix to do sanity check on blocks for inline_data inode
inode can be fuzzed, so it can has F2FS_INLINE_DATA flag and valid
i_blocks/i_nid value, this patch supports to do extra sanity check
to detect such corrupted state.
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs/inline.c')
-rw-r--r-- | fs/f2fs/inline.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 7638d0d7b7ee..0203c3baabb6 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c @@ -33,11 +33,29 @@ bool f2fs_may_inline_data(struct inode *inode) return !f2fs_post_read_required(inode); } -bool f2fs_sanity_check_inline_data(struct inode *inode) +static bool inode_has_blocks(struct inode *inode, struct page *ipage) +{ + struct f2fs_inode *ri = F2FS_INODE(ipage); + int i; + + if (F2FS_HAS_BLOCKS(inode)) + return true; + + for (i = 0; i < DEF_NIDS_PER_INODE; i++) { + if (ri->i_nid[i]) + return true; + } + return false; +} + +bool f2fs_sanity_check_inline_data(struct inode *inode, struct page *ipage) { if (!f2fs_has_inline_data(inode)) return false; + if (inode_has_blocks(inode, ipage)) + return false; + if (!support_inline_data(inode)) return true; |