Notice: We have migrated to GitLab launching 2024-05-01 see here: https://gitlab.rtems.org/

Ticket #1746: pr1746-head-heap-fix.diff

File pr1746-head-heap-fix.diff, 2.4 KB (added by Chris Johns, on 03/01/11 at 02:19:39)

Move the protection calls to after the in heap checks.

  • cpukit/score/src/heapfree.c

    RCS file: /usr1/CVS/rtems/cpukit/score/src/heapfree.c,v
    retrieving revision 1.14
    diff -p -u -u -r1.14 heapfree.c
     
    108108bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
    109109{
    110110  Heap_Statistics *const stats = &heap->stats;
    111   uintptr_t alloc_begin = (uintptr_t) alloc_begin_ptr;
    112   Heap_Block *block =
    113     _Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
     111  uintptr_t alloc_begin;
     112  Heap_Block *block;
    114113  Heap_Block *next_block = NULL;
    115114  uintptr_t block_size = 0;
    116115  uintptr_t next_block_size = 0;
    117116  bool next_is_free = false;
    118117
    119   _Heap_Protection_block_check( heap, block );
    120 
     118  alloc_begin = (uintptr_t) alloc_begin_ptr;
     119  block = _Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
     120 
    121121  if ( !_Heap_Is_block_in_heap( heap, block ) ) {
    122122    return false;
    123123  }
    124124
     125  _Heap_Protection_block_check( heap, block );
     126
    125127  block_size = _Heap_Block_size( block );
    126128  next_block = _Heap_Block_at( block, block_size );
    127129
    128   _Heap_Protection_block_check( heap, next_block );
    129 
    130130  if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
    131     _HAssert( false );
    132131    return false;
    133132  }
    134133
     134  _Heap_Protection_block_check( heap, next_block );
     135
    135136  if ( !_Heap_Is_prev_used( next_block ) ) {
    136137    _Heap_Protection_block_error( heap, block );
    137 
    138138    return false;
    139139  }
    140140
  • cpukit/score/src/heapresizeblock.c

    RCS file: /usr1/CVS/rtems/cpukit/score/src/heapresizeblock.c,v
    retrieving revision 1.13
    diff -p -u -u -r1.13 heapresizeblock.c
    Heap_Resize_status _Heap_Resize_block( 
    104104  *old_size = 0;
    105105  *new_size = 0;
    106106
    107   _Heap_Protection_block_check( heap, block );
    108 
    109107  if ( _Heap_Is_block_in_heap( heap, block ) ) {
     108    _Heap_Protection_block_check( heap, block );
    110109    return _Heap_Resize_block_checked(
    111110      heap,
    112111      block,
    Heap_Resize_status _Heap_Resize_block( 
    115114      old_size,
    116115      new_size
    117116    );
    118   } else {
    119     return HEAP_RESIZE_FATAL_ERROR;
    120117  }
     118  return HEAP_RESIZE_FATAL_ERROR;
    121119}