git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ARM64: check stack pointer in get_wchan
[pandora-kernel.git]
/
arch
/
arm64
/
kernel
/
process.c
diff --git
a/arch/arm64/kernel/process.c
b/arch/arm64/kernel/process.c
index
de17c89
..
0adb8f0
100644
(file)
--- a/
arch/arm64/kernel/process.c
+++ b/
arch/arm64/kernel/process.c
@@
-308,6
+308,7
@@
struct task_struct *__switch_to(struct task_struct *prev,
unsigned long get_wchan(struct task_struct *p)
{
struct stackframe frame;
unsigned long get_wchan(struct task_struct *p)
{
struct stackframe frame;
+ unsigned long stack_page;
int count = 0;
if (!p || p == current || p->state == TASK_RUNNING)
return 0;
int count = 0;
if (!p || p == current || p->state == TASK_RUNNING)
return 0;
@@
-315,9
+316,11
@@
unsigned long get_wchan(struct task_struct *p)
frame.fp = thread_saved_fp(p);
frame.sp = thread_saved_sp(p);
frame.pc = thread_saved_pc(p);
frame.fp = thread_saved_fp(p);
frame.sp = thread_saved_sp(p);
frame.pc = thread_saved_pc(p);
+ stack_page = (unsigned long)task_stack_page(p);
do {
do {
- int ret = unwind_frame(&frame);
- if (ret < 0)
+ if (frame.sp < stack_page ||
+ frame.sp >= stack_page + THREAD_SIZE ||
+ unwind_frame(&frame))
return 0;
if (!in_sched_functions(frame.pc))
return frame.pc;
return 0;
if (!in_sched_functions(frame.pc))
return frame.pc;