2828#include <debug.h>
2929#include <stdbool.h>
3030#include <stdint.h>
31+ #include <stdio.h>
3132
3233#include "kasan.h"
3334
@@ -74,6 +75,12 @@ struct kasan_region_s
7475 uintptr_t shadow [1 ];
7576};
7677
78+ /****************************************************************************
79+ * Private Function Prototypes
80+ ****************************************************************************/
81+
82+ static bool kasan_is_poisoned (FAR const void * addr , size_t size );
83+
7784/****************************************************************************
7885 * Private Data
7986 ****************************************************************************/
@@ -136,6 +143,49 @@ static FAR uintptr_t *kasan_mem_to_shadow(FAR const void *ptr, size_t size,
136143 return NULL ;
137144}
138145
146+ static void kasan_show_memory (FAR const uint8_t * addr , size_t size ,
147+ size_t dumpsize )
148+ {
149+ FAR const uint8_t * start = (FAR const uint8_t * )
150+ (((uintptr_t )addr ) & ~0xf ) - dumpsize ;
151+ FAR const uint8_t * end = start + 2 * dumpsize ;
152+ FAR const uint8_t * p = start ;
153+ char buffer [256 ];
154+
155+ _alert ("Shadow bytes around the buggy address:\n" );
156+ for (p = start ; p < end ; p += 16 )
157+ {
158+ int ret = sprintf (buffer , " %p: " , p );
159+ int i ;
160+
161+ for (i = 0 ; i < 16 ; i ++ )
162+ {
163+ if (kasan_is_poisoned (p + i , 1 ))
164+ {
165+ if (p + i == addr )
166+ {
167+ ret += sprintf (buffer + ret ,
168+ "\b[\033[31m%02x\033[0m " , p [i ]);
169+ }
170+ else if (p + i == addr + size - 1 )
171+ {
172+ ret += sprintf (buffer + ret , "\033[31m%02x\033[0m]" , p [i ]);
173+ }
174+ else
175+ {
176+ ret += sprintf (buffer + ret , "\033[31m%02x\033[0m " , p [i ]);
177+ }
178+ }
179+ else
180+ {
181+ ret += sprintf (buffer + ret , "\033[37m%02x\033[0m " , p [i ]);
182+ }
183+ }
184+
185+ _alert ("%s\n" , buffer );
186+ }
187+ }
188+
139189static void kasan_report (FAR const void * addr , size_t size ,
140190 bool is_write ,
141191 FAR void * return_address )
@@ -148,6 +198,8 @@ static void kasan_report(FAR const void *addr, size_t size,
148198 "size is %zu, return address: %p\n" ,
149199 is_write ? "write" : "read" ,
150200 addr , size , return_address );
201+
202+ kasan_show_memory (addr , size , 80 );
151203 PANIC ();
152204 }
153205
0 commit comments