|
@@ -560,11 +560,16 @@ user_backtrace(struct frame_tail __user *tail,
|
|
struct perf_callchain_entry *entry)
|
|
struct perf_callchain_entry *entry)
|
|
{
|
|
{
|
|
struct frame_tail buftail;
|
|
struct frame_tail buftail;
|
|
|
|
+ unsigned long err;
|
|
|
|
|
|
- /* Also check accessibility of one struct frame_tail beyond */
|
|
|
|
if (!access_ok(VERIFY_READ, tail, sizeof(buftail)))
|
|
if (!access_ok(VERIFY_READ, tail, sizeof(buftail)))
|
|
return NULL;
|
|
return NULL;
|
|
- if (__copy_from_user_inatomic(&buftail, tail, sizeof(buftail)))
|
|
|
|
|
|
+
|
|
|
|
+ pagefault_disable();
|
|
|
|
+ err = __copy_from_user_inatomic(&buftail, tail, sizeof(buftail));
|
|
|
|
+ pagefault_enable();
|
|
|
|
+
|
|
|
|
+ if (err)
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
perf_callchain_store(entry, buftail.lr);
|
|
perf_callchain_store(entry, buftail.lr);
|