A single bugfix for the ORC unwinder to ensure that the error flag which
tells the unwinding code whether a stack trace can be trusted or not is always set correctly. This was messed up by a couple of changes in the recent past. -----BEGIN PGP SIGNATURE----- iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAl7BC+gTHHRnbHhAbGlu dXRyb25peC5kZQAKCRCmGPVMDXSYoWFBEACR8MiO0VM2XXNsejd7rttgs/eoC4/M IKM5K1hq4eRCTodwVnkWwLk6p0asAMKhzpWQ3MS5RJBNAYxLbbxnsYSGtd8zIsdV wk6jbNYeT2MUZq2tYkjn3b9B6+91FFMZq6q+KDOfNPqcKZyP4n5o5QSewznBvQwt dHvjGgegJDjrrtuhLSQKG/uvSSi2hN9S5ibSMCa004GnH6P+uk/eICpvUXwNCyjV ygogYTmQQqAEqnlqVNdQxo+DFYbaxKCw12VSoBeOsEySljPdc136hP/j7Tzbf2em rkqtyXwng1+yG0vozMCAkyP5l3uA+HUculQLdmO8/55eia5Dl/zgsp3SvW7/2ONS 0DRfGo0ghoZgId1oDu6DGPsX80wKKskerJpTN/tHWTXQWeUXCNXrX//lhrFiwd7P mHiyuk+INw3LQBkTlf7XhAf28w/9/+gCm3prEGnUCmLaJOeZ8HtL0mwDzudgc9Ca NW/b3tdt4JU3oXKyyqywr4XAYfxlfmyf3DrBMnuHdTgccaB9PAAzugjmDnFJOuzk jQw/Qfd6w7ZgVcVoaNQjjeogMTryGthCOPe9DzPUgkr+jCDsMwXopCvxbhbWI9e5 L1/U5ilka/VC2ZP7qZUvwsltCgp6RamhDb3yLZbn/2PKf0sFKVoI/j/g1qMnLNZt TBNjzYuWAC8Hlw== =4kDr -----END PGP SIGNATURE----- Merge tag 'objtool-urgent-2020-05-17' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull x86 stack unwinding fix from Thomas Gleixner: "A single bugfix for the ORC unwinder to ensure that the error flag which tells the unwinding code whether a stack trace can be trusted or not is always set correctly. This was messed up by a couple of changes in the recent past" * tag 'objtool-urgent-2020-05-17' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/unwind/orc: Fix error handling in __unwind_start()
This commit is contained in:
commit
ef0d5b9102
|
@ -617,23 +617,23 @@ EXPORT_SYMBOL_GPL(unwind_next_frame);
|
||||||
void __unwind_start(struct unwind_state *state, struct task_struct *task,
|
void __unwind_start(struct unwind_state *state, struct task_struct *task,
|
||||||
struct pt_regs *regs, unsigned long *first_frame)
|
struct pt_regs *regs, unsigned long *first_frame)
|
||||||
{
|
{
|
||||||
if (!orc_init)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
memset(state, 0, sizeof(*state));
|
memset(state, 0, sizeof(*state));
|
||||||
state->task = task;
|
state->task = task;
|
||||||
|
|
||||||
|
if (!orc_init)
|
||||||
|
goto err;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Refuse to unwind the stack of a task while it's executing on another
|
* Refuse to unwind the stack of a task while it's executing on another
|
||||||
* CPU. This check is racy, but that's ok: the unwinder has other
|
* CPU. This check is racy, but that's ok: the unwinder has other
|
||||||
* checks to prevent it from going off the rails.
|
* checks to prevent it from going off the rails.
|
||||||
*/
|
*/
|
||||||
if (task_on_another_cpu(task))
|
if (task_on_another_cpu(task))
|
||||||
goto done;
|
goto err;
|
||||||
|
|
||||||
if (regs) {
|
if (regs) {
|
||||||
if (user_mode(regs))
|
if (user_mode(regs))
|
||||||
goto done;
|
goto the_end;
|
||||||
|
|
||||||
state->ip = regs->ip;
|
state->ip = regs->ip;
|
||||||
state->sp = regs->sp;
|
state->sp = regs->sp;
|
||||||
|
@ -666,6 +666,7 @@ void __unwind_start(struct unwind_state *state, struct task_struct *task,
|
||||||
* generate some kind of backtrace if this happens.
|
* generate some kind of backtrace if this happens.
|
||||||
*/
|
*/
|
||||||
void *next_page = (void *)PAGE_ALIGN((unsigned long)state->sp);
|
void *next_page = (void *)PAGE_ALIGN((unsigned long)state->sp);
|
||||||
|
state->error = true;
|
||||||
if (get_stack_info(next_page, state->task, &state->stack_info,
|
if (get_stack_info(next_page, state->task, &state->stack_info,
|
||||||
&state->stack_mask))
|
&state->stack_mask))
|
||||||
return;
|
return;
|
||||||
|
@ -691,8 +692,9 @@ void __unwind_start(struct unwind_state *state, struct task_struct *task,
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
done:
|
err:
|
||||||
|
state->error = true;
|
||||||
|
the_end:
|
||||||
state->stack_info.type = STACK_TYPE_UNKNOWN;
|
state->stack_info.type = STACK_TYPE_UNKNOWN;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(__unwind_start);
|
EXPORT_SYMBOL_GPL(__unwind_start);
|
||||||
|
|
Loading…
Reference in New Issue