mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 11:06:41 -05:00
erofs: avoid reading more for fragment maps
Since all real encoded extents (directly handled by the decompression subsystem) have a sane, limited maximum decoded length (Z_EROFS_PCLUSTER_MAX_DSIZE), and the read-more policy is only applied if needed. However, it makes no sense to read more for non-encoded maps, such as fragment extents, since such extents can be huge (up to i_size) and there is no benefit to reading more at this layer. For normal images, it does not really matter, but for crafted images generated by syzbot, excessively large fragment extents can cause read-more to run for an overly long time. Reported-and-tested-by: syzbot+1a9af3ef3c84c5e14dcc@syzkaller.appspotmail.com Closes: https://lore.kernel.org/r/68c8583d.050a0220.2ff435.03a3.GAE@google.com Fixes:b44686c839("erofs: fix large fragment handling") Fixes:b15b2e307c("erofs: support on-disk compressed fragments data") Reviewed-by: Hongbo Li <lihongbo22@huawei.com> Reviewed-by: Chao Yu <chao@kernel.org> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
This commit is contained in:
@@ -1835,7 +1835,7 @@ static void z_erofs_pcluster_readmore(struct z_erofs_frontend *f,
|
||||
map->m_la = end;
|
||||
err = z_erofs_map_blocks_iter(inode, map,
|
||||
EROFS_GET_BLOCKS_READMORE);
|
||||
if (err)
|
||||
if (err || !(map->m_flags & EROFS_MAP_ENCODED))
|
||||
return;
|
||||
|
||||
/* expand ra for the trailing edge if readahead */
|
||||
@@ -1847,7 +1847,7 @@ static void z_erofs_pcluster_readmore(struct z_erofs_frontend *f,
|
||||
end = round_up(end, PAGE_SIZE);
|
||||
} else {
|
||||
end = round_up(map->m_la, PAGE_SIZE);
|
||||
if (!map->m_llen)
|
||||
if (!(map->m_flags & EROFS_MAP_ENCODED) || !map->m_llen)
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user