mm/kasan: prevent deadlock in kasan reporting
When we end up calling kasan_report in real mode, our shadow mapping for the spinlock variable will show poisoned. This will result in us calling kasan_report_error with lock_report spin lock held. To prevent this disable kasan reporting when we are priting error w.r.t kasan. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Reviewed-by: Andrey Ryabinin <ryabinin.a.a@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
f2377d4eaa
Коммит
fc5aeeaf59
|
@ -173,12 +173,10 @@ static void print_shadow_for_address(const void *addr)
|
|||
* function, because generic functions may try to
|
||||
* access kasan mapping for the passed address.
|
||||
*/
|
||||
kasan_disable_current();
|
||||
memcpy(shadow_buf, shadow_row, SHADOW_BYTES_PER_ROW);
|
||||
print_hex_dump(KERN_ERR, buffer,
|
||||
DUMP_PREFIX_NONE, SHADOW_BYTES_PER_ROW, 1,
|
||||
shadow_buf, SHADOW_BYTES_PER_ROW, 0);
|
||||
kasan_enable_current();
|
||||
|
||||
if (row_is_guilty(shadow_row, shadow))
|
||||
pr_err("%*c\n",
|
||||
|
@ -195,6 +193,10 @@ void kasan_report_error(struct kasan_access_info *info)
|
|||
{
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* Make sure we don't end up in loop.
|
||||
*/
|
||||
kasan_disable_current();
|
||||
spin_lock_irqsave(&report_lock, flags);
|
||||
pr_err("================================="
|
||||
"=================================\n");
|
||||
|
@ -204,12 +206,17 @@ void kasan_report_error(struct kasan_access_info *info)
|
|||
pr_err("================================="
|
||||
"=================================\n");
|
||||
spin_unlock_irqrestore(&report_lock, flags);
|
||||
kasan_enable_current();
|
||||
}
|
||||
|
||||
void kasan_report_user_access(struct kasan_access_info *info)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* Make sure we don't end up in loop.
|
||||
*/
|
||||
kasan_disable_current();
|
||||
spin_lock_irqsave(&report_lock, flags);
|
||||
pr_err("================================="
|
||||
"=================================\n");
|
||||
|
@ -222,6 +229,7 @@ void kasan_report_user_access(struct kasan_access_info *info)
|
|||
pr_err("================================="
|
||||
"=================================\n");
|
||||
spin_unlock_irqrestore(&report_lock, flags);
|
||||
kasan_enable_current();
|
||||
}
|
||||
|
||||
void kasan_report(unsigned long addr, size_t size,
|
||||
|
|
Загрузка…
Ссылка в новой задаче