|
@@ -3094,11 +3094,19 @@ static inline struct thread_info *task_thread_info(struct task_struct *task)
|
|
|
{
|
|
|
return &task->thread_info;
|
|
|
}
|
|
|
+
|
|
|
+/*
|
|
|
+ * When accessing the stack of a non-current task that might exit, use
|
|
|
+ * try_get_task_stack() instead. task_stack_page will return a pointer
|
|
|
+ * that could get freed out from under you.
|
|
|
+ */
|
|
|
static inline void *task_stack_page(const struct task_struct *task)
|
|
|
{
|
|
|
return task->stack;
|
|
|
}
|
|
|
+
|
|
|
#define setup_thread_stack(new,old) do { } while(0)
|
|
|
+
|
|
|
static inline unsigned long *end_of_stack(const struct task_struct *task)
|
|
|
{
|
|
|
return task->stack;
|
|
@@ -3134,6 +3142,14 @@ static inline unsigned long *end_of_stack(struct task_struct *p)
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
+
|
|
|
+static inline void *try_get_task_stack(struct task_struct *tsk)
|
|
|
+{
|
|
|
+ return task_stack_page(tsk);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void put_task_stack(struct task_struct *tsk) {}
|
|
|
+
|
|
|
#define task_stack_end_corrupted(task) \
|
|
|
(*(end_of_stack(task)) != STACK_END_MAGIC)
|
|
|
|