Skip to content

Commit 595dd46

Browse files
jiazhang0Ingo Molnar
authored andcommitted
vfs/proc/kcore, x86/mm/kcore: Fix SMAP fault when dumping vsyscall user page
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]>
1 parent aec6487 commit 595dd46

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
@@ -1193,8 +1193,7 @@ void __init mem_init(void)
11931193
register_page_bootmem_info();
11941194

11951195
/* Register memory areas for /proc/kcore */
1196-
kclist_add(&kcore_vsyscall, (void *)VSYSCALL_ADDR,
1197-
PAGE_SIZE, KCORE_OTHER);
1196+
kclist_add(&kcore_vsyscall, (void *)VSYSCALL_ADDR, PAGE_SIZE, KCORE_USER);
11981197

11991198
mem_init_print_info(NULL);
12001199
}

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)