28
28
#include <debug.h>
29
29
#include <stdbool.h>
30
30
#include <stdint.h>
31
+ #include <stdio.h>
31
32
32
33
#include "kasan.h"
33
34
@@ -74,6 +75,12 @@ struct kasan_region_s
74
75
uintptr_t shadow [1 ];
75
76
};
76
77
78
+ /****************************************************************************
79
+ * Private Function Prototypes
80
+ ****************************************************************************/
81
+
82
+ static bool kasan_is_poisoned (FAR const void * addr , size_t size );
83
+
77
84
/****************************************************************************
78
85
* Private Data
79
86
****************************************************************************/
@@ -136,6 +143,49 @@ static FAR uintptr_t *kasan_mem_to_shadow(FAR const void *ptr, size_t size,
136
143
return NULL ;
137
144
}
138
145
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
+
139
189
static void kasan_report (FAR const void * addr , size_t size ,
140
190
bool is_write ,
141
191
FAR void * return_address )
@@ -148,6 +198,8 @@ static void kasan_report(FAR const void *addr, size_t size,
148
198
"size is %zu, return address: %p\n" ,
149
199
is_write ? "write" : "read" ,
150
200
addr , size , return_address );
201
+
202
+ kasan_show_memory (addr , size , 80 );
151
203
PANIC ();
152
204
}
153
205
0 commit comments