Skip to content

Commit fee5eae

Browse files
konisakpm00
authored andcommitted
nilfs2: fix possible out-of-bounds segment allocation in resize ioctl
Syzbot reports that in its stress test for resize ioctl, the log writing function nilfs_segctor_do_construct hits a WARN_ON in nilfs_segctor_truncate_segments(). It turned out that there is a problem with the current implementation of the resize ioctl, which changes the writable range on the device (the range of allocatable segments) at the end of the resize process. This order is necessary for file system expansion to avoid corrupting the superblock at trailing edge. However, in the case of a file system shrink, if log writes occur after truncating out-of-bounds trailing segments and before the resize is complete, segments may be allocated from the truncated space. The userspace resize tool was fine as it limits the range of allocatable segments before performing the resize, but it can run into this issue if the resize ioctl is called alone. Fix this issue by changing nilfs_sufile_resize() to update the range of allocatable segments immediately after successful truncation of segment space in case of file system shrink. Link: https://lkml.kernel.org/r/20230524094348.3784-1-konishi.ryusuke@gmail.com Fixes: 4e33f9e ("nilfs2: implement resize ioctl") Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com> Reported-by: syzbot+33494cd0df2ec2931851@syzkaller.appspotmail.com Closes: https://lkml.kernel.org/r/0000000000005434c405fbbafdc5@google.com Tested-by: Ryusuke Konishi <konishi.ryusuke@gmail.com> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 88ac3bb commit fee5eae

1 file changed

Lines changed: 9 additions & 0 deletions

File tree

fs/nilfs2/sufile.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,15 @@ int nilfs_sufile_resize(struct inode *sufile, __u64 newnsegs)
779779
goto out_header;
780780

781781
sui->ncleansegs -= nsegs - newnsegs;
782+
783+
/*
784+
* If the sufile is successfully truncated, immediately adjust
785+
* the segment allocation space while locking the semaphore
786+
* "mi_sem" so that nilfs_sufile_alloc() never allocates
787+
* segments in the truncated space.
788+
*/
789+
sui->allocmax = newnsegs - 1;
790+
sui->allocmin = 0;
782791
}
783792

784793
kaddr = kmap_atomic(header_bh->b_page);

0 commit comments

Comments
 (0)