Skip to content

Commit f4d6e45

Browse files
jiazhang0gregkh
authored andcommitted
vfs/proc/kcore, x86/mm/kcore: Fix SMAP fault when dumping vsyscall user page
[ Upstream commit 595dd46 ] Commit: df04abf ("fs/proc/kcore.c: Add bounce buffer for ktext data") ... introduced a bounce buffer to work around CONFIG_HARDENED_USERCOPY=y. However, accessing the vsyscall user page will cause an SMAP fault. Replace memcpy() with copy_from_user() to fix this bug works, but adding a common way to handle this sort of user page may be useful for future. Currently, only vsyscall page requires KCORE_USER. Signed-off-by: Jia Zhang <[email protected]> Reviewed-by: Jiri Olsa <[email protected]> Cc: Al Viro <[email protected]> Cc: Linus Torvalds <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: [email protected] Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Ingo Molnar <[email protected]> Signed-off-by: Sasha Levin <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent c064b7c commit f4d6e45

File tree

3 files changed

+6
-2
lines changed

3 files changed

+6
-2
lines changed

arch/x86/mm/init_64.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,8 +1180,7 @@ void __init mem_init(void)
11801180
after_bootmem = 1;
11811181

11821182
/* Register memory areas for /proc/kcore */
1183-
kclist_add(&kcore_vsyscall, (void *)VSYSCALL_ADDR,
1184-
PAGE_SIZE, KCORE_OTHER);
1183+
kclist_add(&kcore_vsyscall, (void *)VSYSCALL_ADDR, PAGE_SIZE, KCORE_USER);
11851184

11861185
mem_init_print_info(NULL);
11871186
}

fs/proc/kcore.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,10 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos)
510510
/* we have to zero-fill user buffer even if no read */
511511
if (copy_to_user(buffer, buf, tsz))
512512
return -EFAULT;
513+
} else if (m->type == KCORE_USER) {
514+
/* User page is handled prior to normal kernel page: */
515+
if (copy_to_user(buffer, (char *)start, tsz))
516+
return -EFAULT;
513517
} else {
514518
if (kern_addr_valid(start)) {
515519
/*

include/linux/kcore.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ enum kcore_type {
1010
KCORE_VMALLOC,
1111
KCORE_RAM,
1212
KCORE_VMEMMAP,
13+
KCORE_USER,
1314
KCORE_OTHER,
1415
};
1516

0 commit comments

Comments
 (0)