Re: [patch 5/13] s390: show_task oops.

From: Andrew Morton
Date: Thu Jan 12 2006 - 19:55:12 EST


Martin Schwidefsky <schwidefsky@xxxxxxxxxx> wrote:
>
> From: Heiko Carstens <heiko.carstens@xxxxxxxxxx>
>
> [patch 5/13] s390: show_task oops.
>
> The show_task function walks the kernel stack backchain of
> processes assuming that the processes are not running. Since
> this assumption is not correct walking the backchain can lead
> to an addressing exception and therefore to a kernel hang.
> So prevent the kernel hang (you still get incorrect results)
> verity that all read accesses are within the bounds of the
> kernel stack before performing them.
>

This one needs to be thought about and tested versus the just-merged
s390-task_stack_page.patch. I guess it'll still work, but some of the
pretty new accessors could be used in there, at least.

> --- linux-2.6/arch/s390/kernel/process.c 2006-01-12 15:43:19.000000000 +0100
> +++ linux-2.6-patched/arch/s390/kernel/process.c 2006-01-12 15:43:55.000000000 +0100
> @@ -58,10 +58,19 @@ asmlinkage void ret_from_fork(void) __as
> */
> unsigned long thread_saved_pc(struct task_struct *tsk)
> {
> - struct stack_frame *sf;
> + struct stack_frame *sf, *low, *high;
>
> - sf = (struct stack_frame *) tsk->thread.ksp;
> - sf = (struct stack_frame *) sf->back_chain;
> + if (!tsk || !tsk->thread_info)
> + return 0;
> + low = (struct stack_frame *) tsk->thread_info;
> + high = (struct stack_frame *)
> + ((unsigned long) tsk->thread_info + THREAD_SIZE) - 1;
> + sf = (struct stack_frame *) (tsk->thread.ksp & PSW_ADDR_INSN);
> + if (sf <= low || sf > high)
> + return 0;
> + sf = (struct stack_frame *) (sf->back_chain & PSW_ADDR_INSN);
> + if (sf <= low || sf > high)
> + return 0;
> return sf->gprs[8];
> }
>
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/