lkml.org 
[lkml]   [2016]   [Jun]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 11/13] x86/dumpstack/64: Handle faults when printing the "Stack:" part of an OOPS
    Date
    If we overflow the stack into a guard page, we'll recursively fault
    when trying to dump the contents of the guard page. Use
    probe_kernel_address so we can recover if this happens.

    Signed-off-by: Andy Lutomirski <luto@kernel.org>
    ---
    arch/x86/kernel/dumpstack_64.c | 12 ++++++++++--
    1 file changed, 10 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c
    index 603356a5597a..5e298638c790 100644
    --- a/arch/x86/kernel/dumpstack_64.c
    +++ b/arch/x86/kernel/dumpstack_64.c
    @@ -276,6 +276,8 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,

    stack = sp;
    for (i = 0; i < kstack_depth_to_print; i++) {
    + unsigned long word;
    +
    if (stack >= irq_stack && stack <= irq_stack_end) {
    if (stack == irq_stack_end) {
    stack = (unsigned long *) (irq_stack_end[-1]);
    @@ -285,12 +287,18 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
    if (kstack_end(stack))
    break;
    }
    +
    + if (probe_kernel_address(stack, word))
    + break;
    +
    if ((i % STACKSLOTS_PER_LINE) == 0) {
    if (i != 0)
    pr_cont("\n");
    - printk("%s %016lx", log_lvl, *stack++);
    + printk("%s %016lx", log_lvl, word);
    } else
    - pr_cont(" %016lx", *stack++);
    + pr_cont(" %016lx", word);
    +
    + stack++;
    touch_nmi_watchdog();
    }
    preempt_enable();
    --
    2.7.4
    \
     
     \ /
      Last update: 2016-06-16 02:41    [W:4.223 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site