Commit 2981a519 authored by Edward Adam Davis's avatar Edward Adam Davis Committed by Wenyu Huang
Browse files

jfs: fix null ptr deref in dtInsertEntry

stable inclusion
from stable-v6.6.47
commit 6ea10dbb1e6c58384136e9adfd75f81951e423f6
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IAMMM9
CVE: CVE-2024-44939

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=6ea10dbb1e6c58384136e9adfd75f81951e423f6



--------------------------------

[ Upstream commit ce6dede912f064a855acf6f04a04cbb2c25b8c8c ]

[syzbot reported]
general protection fault, probably for non-canonical address 0xdffffc0000000001: 0000 [#1] PREEMPT SMP KASAN PTI
KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]
CPU: 0 PID: 5061 Comm: syz-executor404 Not tainted 6.8.0-syzkaller-08951-gfe46a7dd189e #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/27/2024
RIP: 0010:dtInsertEntry+0xd0c/0x1780 fs/jfs/jfs_dtree.c:3713
...
[Analyze]
In dtInsertEntry(), when the pointer h has the same value as p, after writing
name in UniStrncpy_to_le(), p->header.flag will be cleared. This will cause the
previously true judgment "p->header.flag & BT-LEAF" to change to no after writing
the name operation, this leads to entering an incorrect branch and accessing the
uninitialized object ih when judging this condition for the second time.

[Fix]
After got the page, check freelist first, if freelist == 0 then exit dtInsert()
and return -EINVAL.

Reported-by: default avatar <syzbot+bba84aef3a26fb93deb9@syzkaller.appspotmail.com>
Signed-off-by: default avatarEdward Adam Davis <eadavis@qq.com>
Signed-off-by: default avatarDave Kleikamp <dave.kleikamp@oracle.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarWenyu Huang <huangwenyu5@huawei.com>
parent 68635247
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -834,6 +834,8 @@ int dtInsert(tid_t tid, struct inode *ip,
	 * the full page.
	 */
	DT_GETSEARCH(ip, btstack->top, bn, mp, p, index);
	if (p->header.freelist == 0)
		return -EINVAL;

	/*
	 *	insert entry for new key