fs: ocfs2: fix kernel BUG in ocfs2_find_victim_chain
Subsystems (2)
PATCH 1/1 fs: ocfs2: fix kernel BUG in ocfs2_find_victim_chain
syzbot reported a kernel BUG in ocfs2_find_victim_chain() because the cl_next_free_rec field of the allocation chain list is 0, triggring the BUG_ON(!cl->cl_next_free_rec) condition and panicking the kernel.
To fix this, cl_next_free_rec is checked inside the caller of ocfs2_find_victim_chain() i.e. ocfs2_claim_suballoc_bits() and if it is equal to 0, ocfs2_error() is called, to log the corruption and force the filesystem into read-only mode, to prevent further damage.
Reported-by [email protected]
Tested-by [email protected]
Signed-off-by Prithvi Tambewagh <[email protected]>
--- fs/ocfs2/suballoc.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/ocfs2/suballoc.c +7 -0
@@ -1993,6 +1993,13 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_alloc_context *ac, cl = (struct ocfs2_chain_list *) &fe->id2.i_chain; +if (le16_to_cpu (cl->cl_next_free_rec) ==0 ) { + status =ocfs2_error (ac->ac_inode->i_sb, +"Chain allocator dinode %llu has 0 chains\n" , + (unsigned long long )le64_to_cpu (fe->i_blkno)); + goto bail; + } + victim =ocfs2_find_victim_chain (cl); ac->ac_chain = victim;
base-commit: 939f15e640f193616691d3bcde0089760e75b0d3
Signature · 1 line
2.34.1