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.
|
-
RCS file: /usr1/CVS/rtems/cpukit/score/src/heapfree.c,v
retrieving revision 1.14
diff -p -u -u -r1.14 heapfree.c
|
|
|
108 | 108 | bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr ) |
109 | 109 | { |
110 | 110 | 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; |
114 | 113 | Heap_Block *next_block = NULL; |
115 | 114 | uintptr_t block_size = 0; |
116 | 115 | uintptr_t next_block_size = 0; |
117 | 116 | bool next_is_free = false; |
118 | 117 | |
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 | |
121 | 121 | if ( !_Heap_Is_block_in_heap( heap, block ) ) { |
122 | 122 | return false; |
123 | 123 | } |
124 | 124 | |
| 125 | _Heap_Protection_block_check( heap, block ); |
| 126 | |
125 | 127 | block_size = _Heap_Block_size( block ); |
126 | 128 | next_block = _Heap_Block_at( block, block_size ); |
127 | 129 | |
128 | | _Heap_Protection_block_check( heap, next_block ); |
129 | | |
130 | 130 | if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { |
131 | | _HAssert( false ); |
132 | 131 | return false; |
133 | 132 | } |
134 | 133 | |
| 134 | _Heap_Protection_block_check( heap, next_block ); |
| 135 | |
135 | 136 | if ( !_Heap_Is_prev_used( next_block ) ) { |
136 | 137 | _Heap_Protection_block_error( heap, block ); |
137 | | |
138 | 138 | return false; |
139 | 139 | } |
140 | 140 | |
-
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( |
104 | 104 | *old_size = 0; |
105 | 105 | *new_size = 0; |
106 | 106 | |
107 | | _Heap_Protection_block_check( heap, block ); |
108 | | |
109 | 107 | if ( _Heap_Is_block_in_heap( heap, block ) ) { |
| 108 | _Heap_Protection_block_check( heap, block ); |
110 | 109 | return _Heap_Resize_block_checked( |
111 | 110 | heap, |
112 | 111 | block, |
… |
… |
Heap_Resize_status _Heap_Resize_block( |
115 | 114 | old_size, |
116 | 115 | new_size |
117 | 116 | ); |
118 | | } else { |
119 | | return HEAP_RESIZE_FATAL_ERROR; |
120 | 117 | } |
| 118 | return HEAP_RESIZE_FATAL_ERROR; |
121 | 119 | } |
Download in other formats: