Heap protection check bad address

Sebastian Huber sebastian.huber at embedded-brains.de
Tue May 14 05:03:21 UTC 2019


On 14/05/2019 01:04, Chris Johns wrote:
> Hi,
>
> I chased down a buffer overwrite bug in libdl (#3746). On the powerpc and sparc
> the test dl05.exe crashed and on xilinx_zynq_a9_qemu I got a heap protection
> error on free. This was really nice however it is a mission to take that error
> message and figure out the block address that is the cause. A had to add a
> couple of additional prints to get the block address and with that I could set a
> watch point that triggered on the invalid write. The patch to fix the bug was
> the easy part.
>
> Would a bad block variable set by the error handler that can be inspected by a
> debugger or exit handler be useful?

The default is currently:

   static void _Heap_Protection_block_error_default(
     Heap_Control *heap,
     Heap_Block *block
   )
   {
     /* FIXME */
     _Terminate( INTERNAL_ERROR_CORE, 0xdeadbeef );
   }

...

   #ifdef HEAP_PROTECTION
     heap->Protection.block_initialize = 
_Heap_Protection_block_initialize_default;
     heap->Protection.block_check = _Heap_Protection_block_check_default;
     heap->Protection.block_error = _Heap_Protection_block_error_default;
   #endif

You can set your own block_error handler. It would be probably good to 
replace the _Terminate( INTERNAL_ERROR_CORE, 0xdeadbeef ) with something 
similar to the assert() fatal error (without the printk()):

void __assert_func(
   const char *file,
   int         line,
   const char *func,
   const char *failedexpr
)
{
   rtems_assert_context assert_context = {
     .file = file,
     .line = line,
     .function = func,
     .failed_expression = failedexpr
   };

   printk("assertion \"%s\" failed: file \"%s\", line %d%s%s\n",
     failedexpr,
     file,
     line,
     (func) ? ", function: " : "",
     (func) ? func : ""
   );
   rtems_fatal( RTEMS_FATAL_SOURCE_ASSERT, (rtems_fatal_code) 
&assert_context );
}

-- 
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber at embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.



More information about the devel mailing list