forked from Imagelibrary/rtems
2011-03-01 Chris Johns <chrisj@rtems.org>
* score/src/heapfree.c, score/src/heapresizeblock.c: PR 1746. Move
protection block checks to after the block address has been
checked as a valid heap address. Add a special case in the heap
free for a NULL address.
This commit is contained in:
@@ -1,3 +1,10 @@
|
|||||||
|
2011-03-01 Chris Johns <chrisj@rtems.org>
|
||||||
|
|
||||||
|
* score/src/heapfree.c, score/src/heapresizeblock.c: PR 1746. Move
|
||||||
|
protection block checks to after the block address has been
|
||||||
|
checked as a valid heap address. Add a special case in the heap
|
||||||
|
free for a NULL address.
|
||||||
|
|
||||||
2011-02-27 Jennifer Averett <jennifer.averett@OARcorp.com>
|
2011-02-27 Jennifer Averett <jennifer.averett@OARcorp.com>
|
||||||
|
|
||||||
* score/include/rtems/score/schedulerpriority.h,
|
* score/include/rtems/score/schedulerpriority.h,
|
||||||
|
|||||||
@@ -108,33 +108,42 @@
|
|||||||
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
|
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
|
||||||
{
|
{
|
||||||
Heap_Statistics *const stats = &heap->stats;
|
Heap_Statistics *const stats = &heap->stats;
|
||||||
uintptr_t alloc_begin = (uintptr_t) alloc_begin_ptr;
|
uintptr_t alloc_begin;
|
||||||
Heap_Block *block =
|
Heap_Block *block;
|
||||||
_Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
|
|
||||||
Heap_Block *next_block = NULL;
|
Heap_Block *next_block = NULL;
|
||||||
uintptr_t block_size = 0;
|
uintptr_t block_size = 0;
|
||||||
uintptr_t next_block_size = 0;
|
uintptr_t next_block_size = 0;
|
||||||
bool next_is_free = false;
|
bool next_is_free = false;
|
||||||
|
|
||||||
_Heap_Protection_block_check( heap, block );
|
/*
|
||||||
|
* If NULL return true so a free on NULL is considered a valid release. This
|
||||||
|
* is a special case that could be handled by the in heap check how-ever that
|
||||||
|
* would result in false being returned which is wrong.
|
||||||
|
*/
|
||||||
|
if ( alloc_begin_ptr == NULL ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
alloc_begin = (uintptr_t) alloc_begin_ptr;
|
||||||
|
block = _Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
|
||||||
|
|
||||||
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
|
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_Heap_Protection_block_check( heap, block );
|
||||||
|
|
||||||
block_size = _Heap_Block_size( block );
|
block_size = _Heap_Block_size( block );
|
||||||
next_block = _Heap_Block_at( block, block_size );
|
next_block = _Heap_Block_at( block, block_size );
|
||||||
|
|
||||||
_Heap_Protection_block_check( heap, next_block );
|
|
||||||
|
|
||||||
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
|
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
|
||||||
_HAssert( false );
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_Heap_Protection_block_check( heap, next_block );
|
||||||
|
|
||||||
if ( !_Heap_Is_prev_used( next_block ) ) {
|
if ( !_Heap_Is_prev_used( next_block ) ) {
|
||||||
_Heap_Protection_block_error( heap, block );
|
_Heap_Protection_block_error( heap, block );
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -104,9 +104,8 @@ Heap_Resize_status _Heap_Resize_block(
|
|||||||
*old_size = 0;
|
*old_size = 0;
|
||||||
*new_size = 0;
|
*new_size = 0;
|
||||||
|
|
||||||
_Heap_Protection_block_check( heap, block );
|
|
||||||
|
|
||||||
if ( _Heap_Is_block_in_heap( heap, block ) ) {
|
if ( _Heap_Is_block_in_heap( heap, block ) ) {
|
||||||
|
_Heap_Protection_block_check( heap, block );
|
||||||
return _Heap_Resize_block_checked(
|
return _Heap_Resize_block_checked(
|
||||||
heap,
|
heap,
|
||||||
block,
|
block,
|
||||||
@@ -115,7 +114,6 @@ Heap_Resize_status _Heap_Resize_block(
|
|||||||
old_size,
|
old_size,
|
||||||
new_size
|
new_size
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
return HEAP_RESIZE_FATAL_ERROR;
|
|
||||||
}
|
}
|
||||||
|
return HEAP_RESIZE_FATAL_ERROR;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user