mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 10:01:39 -05:00
ocfs2: add boundary check to ocfs2_check_dir_entry()
In 'ocfs2_check_dir_entry()', add extra check whether at least the smallest possible dirent may be located at the specified offset within bh's data, thus preventing an out-of-bounds accesses below. Link: https://lkml.kernel.org/r/20251013062826.122586-1-dmantipov@yandex.ru Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> Reported-by: syzbot+b20bbf680bb0f2ecedae@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=b20bbf680bb0f2ecedae Reviewed-by: Heming Zhao <heming.zhao@suse.com> Cc: Joseph Qi <jiangqi903@gmail.com> Cc: Mark Fasheh <mark@fasheh.com> Cc: Joel Becker <jlbec@evilplan.org> Cc: Junxiao Bi <junxiao.bi@oracle.com> Cc: Changwei Ge <gechangwei@live.cn> Cc: Jun Piao <piaojun@huawei.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
d99dc586ca
commit
390ac56cf0
@@ -302,8 +302,21 @@ static int ocfs2_check_dir_entry(struct inode *dir,
|
||||
unsigned long offset)
|
||||
{
|
||||
const char *error_msg = NULL;
|
||||
const int rlen = le16_to_cpu(de->rec_len);
|
||||
const unsigned long next_offset = ((char *) de - buf) + rlen;
|
||||
unsigned long next_offset;
|
||||
int rlen;
|
||||
|
||||
if (offset > size - OCFS2_DIR_REC_LEN(1)) {
|
||||
/* Dirent is (maybe partially) beyond the buffer
|
||||
* boundaries so touching 'de' members is unsafe.
|
||||
*/
|
||||
mlog(ML_ERROR, "directory entry (#%llu: offset=%lu) "
|
||||
"too close to end or out-of-bounds",
|
||||
(unsigned long long)OCFS2_I(dir)->ip_blkno, offset);
|
||||
return 0;
|
||||
}
|
||||
|
||||
rlen = le16_to_cpu(de->rec_len);
|
||||
next_offset = ((char *) de - buf) + rlen;
|
||||
|
||||
if (unlikely(rlen < OCFS2_DIR_REC_LEN(1)))
|
||||
error_msg = "rec_len is smaller than minimal";
|
||||
|
||||
Reference in New Issue
Block a user