|
@@ -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,
|