|
@@ -154,8 +154,12 @@ static int read_user_stack_64(unsigned long __user *ptr, unsigned long *ret)
|
|
|
((unsigned long)ptr & 7))
|
|
|
return -EFAULT;
|
|
|
|
|
|
- if (!__get_user_inatomic(*ret, ptr))
|
|
|
+ pagefault_disable();
|
|
|
+ if (!__get_user_inatomic(*ret, ptr)) {
|
|
|
+ pagefault_enable();
|
|
|
return 0;
|
|
|
+ }
|
|
|
+ pagefault_enable();
|
|
|
|
|
|
return read_user_stack_slow(ptr, ret, 8);
|
|
|
}
|
|
@@ -166,8 +170,12 @@ static int read_user_stack_32(unsigned int __user *ptr, unsigned int *ret)
|
|
|
((unsigned long)ptr & 3))
|
|
|
return -EFAULT;
|
|
|
|
|
|
- if (!__get_user_inatomic(*ret, ptr))
|
|
|
+ pagefault_disable();
|
|
|
+ if (!__get_user_inatomic(*ret, ptr)) {
|
|
|
+ pagefault_enable();
|
|
|
return 0;
|
|
|
+ }
|
|
|
+ pagefault_enable();
|
|
|
|
|
|
return read_user_stack_slow(ptr, ret, 4);
|
|
|
}
|
|
@@ -294,11 +302,17 @@ static inline int current_is_64bit(void)
|
|
|
*/
|
|
|
static int read_user_stack_32(unsigned int __user *ptr, unsigned int *ret)
|
|
|
{
|
|
|
+ int rc;
|
|
|
+
|
|
|
if ((unsigned long)ptr > TASK_SIZE - sizeof(unsigned int) ||
|
|
|
((unsigned long)ptr & 3))
|
|
|
return -EFAULT;
|
|
|
|
|
|
- return __get_user_inatomic(*ret, ptr);
|
|
|
+ pagefault_disable();
|
|
|
+ rc = __get_user_inatomic(*ret, ptr);
|
|
|
+ pagefault_enable();
|
|
|
+
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
static inline void perf_callchain_user_64(struct perf_callchain_entry *entry,
|