Files
linux/arch/x86/include/asm
Jann Horn 367ccafbcb x86/unwind: Handle NULL pointer calls better in frame unwinder
commit f4f34e1b82 upstream.

When the frame unwinder is invoked for an oops caused by a call to NULL, it
currently skips the parent function because BP still points to the parent's
stack frame; the (nonexistent) current function only has the first half of
a stack frame, and BP doesn't point to it yet.

Add a special case for IP==0 that calculates a fake BP from SP, then uses
the real BP for the next frame.

Note that this handles first_frame specially: Return information about the
parent function as long as the saved IP is >=first_frame, even if the fake
BP points below it.

With an artificially-added NULL call in prctl_set_seccomp(), before this
patch, the trace is:

Call Trace:
 ? prctl_set_seccomp+0x3a/0x50
 __x64_sys_prctl+0x457/0x6f0
 ? __ia32_sys_prctl+0x750/0x750
 do_syscall_64+0x72/0x160
 entry_SYSCALL_64_after_hwframe+0x44/0xa9

After this patch, the trace is:

Call Trace:
 prctl_set_seccomp+0x3a/0x50
 __x64_sys_prctl+0x457/0x6f0
 ? __ia32_sys_prctl+0x750/0x750
 do_syscall_64+0x72/0x160
 entry_SYSCALL_64_after_hwframe+0x44/0xa9

Signed-off-by: Jann Horn <jannh@google.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: syzbot <syzbot+ca95b2b7aef9e7cbd6ab@syzkaller.appspotmail.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Michal Marek <michal.lkml@markovi.net>
Cc: linux-kbuild@vger.kernel.org
Link: https://lkml.kernel.org/r/20190301031201.7416-1-jannh@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-03-27 14:14:42 +09:00
..
2018-09-03 12:41:41 +02:00
2018-02-15 01:15:50 +01:00
2018-07-25 11:53:59 +02:00
2018-03-20 10:01:57 +01:00
2018-05-19 13:55:40 +02:00
2018-08-15 13:44:10 -07:00
2017-12-22 20:13:04 +01:00
2017-12-22 20:13:01 +01:00
2019-03-13 14:02:41 -07:00
2017-07-26 13:18:20 +02:00
2018-05-07 07:15:41 +02:00
2018-10-14 11:11:22 +02:00
2018-07-20 01:11:45 +02:00
2016-01-30 11:22:17 +01:00
2017-11-15 18:21:05 -08:00
2018-03-28 22:47:06 +02:00
2018-03-20 10:01:57 +01:00
2018-09-01 23:01:56 +02:00
2016-06-16 00:04:31 +02:00
2017-11-15 18:21:04 -08:00