@@ -69,14 +69,14 @@ extern void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk,
6969
7070DECLARE_PER_CPU (unsigned long * , irq_stack_ptr );
7171
72- static inline bool on_stack (unsigned long sp , unsigned long low ,
73- unsigned long high , enum stack_type type ,
74- struct stack_info * info )
72+ static inline bool on_stack (unsigned long sp , unsigned long size ,
73+ unsigned long low , unsigned long high ,
74+ enum stack_type type , struct stack_info * info )
7575{
7676 if (!low )
7777 return false;
7878
79- if (sp < low || sp >= high )
79+ if (sp < low || sp + size < sp || sp + size > high )
8080 return false;
8181
8282 if (info ) {
@@ -87,38 +87,38 @@ static inline bool on_stack(unsigned long sp, unsigned long low,
8787 return true;
8888}
8989
90- static inline bool on_irq_stack (unsigned long sp ,
90+ static inline bool on_irq_stack (unsigned long sp , unsigned long size ,
9191 struct stack_info * info )
9292{
9393 unsigned long low = (unsigned long )raw_cpu_read (irq_stack_ptr );
9494 unsigned long high = low + IRQ_STACK_SIZE ;
9595
96- return on_stack (sp , low , high , STACK_TYPE_IRQ , info );
96+ return on_stack (sp , size , low , high , STACK_TYPE_IRQ , info );
9797}
9898
9999static inline bool on_task_stack (const struct task_struct * tsk ,
100- unsigned long sp ,
100+ unsigned long sp , unsigned long size ,
101101 struct stack_info * info )
102102{
103103 unsigned long low = (unsigned long )task_stack_page (tsk );
104104 unsigned long high = low + THREAD_SIZE ;
105105
106- return on_stack (sp , low , high , STACK_TYPE_TASK , info );
106+ return on_stack (sp , size , low , high , STACK_TYPE_TASK , info );
107107}
108108
109109#ifdef CONFIG_VMAP_STACK
110110DECLARE_PER_CPU (unsigned long [OVERFLOW_STACK_SIZE /sizeof (long )], overflow_stack );
111111
112- static inline bool on_overflow_stack (unsigned long sp ,
112+ static inline bool on_overflow_stack (unsigned long sp , unsigned long size ,
113113 struct stack_info * info )
114114{
115115 unsigned long low = (unsigned long )raw_cpu_ptr (overflow_stack );
116116 unsigned long high = low + OVERFLOW_STACK_SIZE ;
117117
118- return on_stack (sp , low , high , STACK_TYPE_OVERFLOW , info );
118+ return on_stack (sp , size , low , high , STACK_TYPE_OVERFLOW , info );
119119}
120120#else
121- static inline bool on_overflow_stack (unsigned long sp ,
121+ static inline bool on_overflow_stack (unsigned long sp , unsigned long size ,
122122 struct stack_info * info ) { return false; }
123123#endif
124124
@@ -128,21 +128,21 @@ static inline bool on_overflow_stack(unsigned long sp,
128128 * context.
129129 */
130130static inline bool on_accessible_stack (const struct task_struct * tsk ,
131- unsigned long sp ,
131+ unsigned long sp , unsigned long size ,
132132 struct stack_info * info )
133133{
134134 if (info )
135135 info -> type = STACK_TYPE_UNKNOWN ;
136136
137- if (on_task_stack (tsk , sp , info ))
137+ if (on_task_stack (tsk , sp , size , info ))
138138 return true;
139139 if (tsk != current || preemptible ())
140140 return false;
141- if (on_irq_stack (sp , info ))
141+ if (on_irq_stack (sp , size , info ))
142142 return true;
143- if (on_overflow_stack (sp , info ))
143+ if (on_overflow_stack (sp , size , info ))
144144 return true;
145- if (on_sdei_stack (sp , info ))
145+ if (on_sdei_stack (sp , size , info ))
146146 return true;
147147
148148 return false;
0 commit comments