@@ -37,7 +37,7 @@ void* malloc(size_t size)
3737 }
3838 else
3939 {
40- total_size = internal::BLOCK_METADATA_SIZE + size;
40+ total_size = internal::BLOCK_METADATA_SIZE + size + internal::CANARY_SIZE ;
4141 is_frame_used = false ;
4242 }
4343
@@ -50,6 +50,7 @@ void* malloc(size_t size)
5050 internal::MemoryBlock* new_block = internal::getMemoryBlockFromAddress (new_memory_allocation);
5151 if (is_frame_used)
5252 {
53+ new_block->magic_ = internal::MAGIC_NUMBER;
5354 new_block->size_ = internal::CHUNK_SIZE;
5455 new_block->allocated_ = false ;
5556 new_block->next_ = nullptr ;
@@ -59,10 +60,12 @@ void* malloc(size_t size)
5960 }
6061 else
6162 {
63+ new_block->magic_ = internal::MAGIC_NUMBER;
6264 new_block->size_ = size;
6365 new_block->allocated_ = true ;
6466 new_block->next_ = nullptr ;
6567 internal::insertMemoryBlockAtEnd (&internal::block_list_head, new_block);
68+ internal::setCanary (new_block);
6669 internal::total_memory_allocated += size;
6770 }
6871
@@ -86,14 +89,16 @@ void* increaseHeap(size_t size)
8689MemoryBlock* findLargeEnoughFreeMemoryBlock (MemoryBlock** block_list_head, size_t size)
8790{
8891 MemoryBlock* current = *block_list_head;
92+ size_t size_needed = size + CANARY_SIZE;
8993 while (current != nullptr )
9094 {
91- if (current->allocated_ == false && current->size_ >= size )
95+ if (current->allocated_ == false && current->size_ >= size_needed )
9296 {
9397 return current;
9498 }
9599 current = current->next_ ;
96100 }
101+
97102 return nullptr ;
98103}
99104
@@ -104,12 +109,14 @@ void* splitFreeMemoryBlockIfPossible(MemoryBlock* new_block, size_t size)
104109 return nullptr ;
105110 }
106111
107- size_t remaining_size = new_block->size_ - size;
112+ size_t size_with_canary = size + CANARY_SIZE;
113+ size_t remaining_size = new_block->size_ - size_with_canary;
108114 char one_byte_payload_size_requirement = 1 ;
109115 if (remaining_size >= BLOCK_METADATA_SIZE + one_byte_payload_size_requirement)
110116 {
111117 void * split_address = getMemoryBlockSplitAddress (new_block, size);
112118 MemoryBlock* new_temp_block = getMemoryBlockFromAddress (split_address);
119+ new_temp_block->magic_ = MAGIC_NUMBER;
113120 new_temp_block->size_ = remaining_size - BLOCK_METADATA_SIZE;
114121 new_temp_block->allocated_ = false ;
115122 new_temp_block->next_ = new_block->next_ ;
@@ -120,17 +127,19 @@ void* splitFreeMemoryBlockIfPossible(MemoryBlock* new_block, size_t size)
120127 }
121128 else
122129 {
123- new_block->size_ = new_block->size_ ;
130+ new_block->size_ = new_block->size_ - CANARY_SIZE ;
124131 new_block->allocated_ = true ;
125132 }
126133
134+ setCanary (new_block);
127135 total_memory_allocated += new_block->size_ ;
136+
128137 return getPayloadAddress (new_block);
129138}
130139
131140void * getMemoryBlockSplitAddress (MemoryBlock* new_block, size_t size)
132141{
133- return (reinterpret_cast <char *>(new_block) + BLOCK_METADATA_SIZE + size);
142+ return (reinterpret_cast <char *>(new_block) + BLOCK_METADATA_SIZE + size + CANARY_SIZE );
134143}
135144
136145void insertMemoryBlockAtEnd (MemoryBlock** block_list_head, MemoryBlock* new_block)
@@ -150,6 +159,18 @@ void insertMemoryBlockAtEnd(MemoryBlock** block_list_head, MemoryBlock* new_bloc
150159 }
151160}
152161
162+ void setCanary (MemoryBlock* block)
163+ {
164+ if (!block || block->allocated_ == false )
165+ {
166+ return ;
167+ }
168+
169+ size_t * canary = reinterpret_cast <size_t *>(reinterpret_cast <char *>(block) +
170+ BLOCK_METADATA_SIZE + block->size_ );
171+ *canary = CANARY_VALUE;
172+ }
173+
153174// helpers
154175void * getPayloadAddress (MemoryBlock* block)
155176{
@@ -180,15 +201,28 @@ size_t getSizeOfAllocatedMemoryBlock(MemoryBlock* block)
180201bool isPointerInHeap (void * ptr)
181202{
182203 void * current_program_break = sbrk (0 );
183- if (ptr < heap_start || ptr >= current_program_break)
204+ return (ptr >= heap_start && ptr < current_program_break);
205+ }
206+
207+ void * getErrorCodeInVoidPtr (size_t error_code) { return reinterpret_cast <void *>(error_code); }
208+
209+ bool isValidBlock (MemoryBlock* block)
210+ {
211+ return block != nullptr && block->magic_ == MAGIC_NUMBER && block->allocated_ == true ;
212+ }
213+
214+ bool checkCanary (MemoryBlock* block)
215+ {
216+ if (!block)
184217 {
185218 return false ;
186219 }
187220
188- return true ;
189- }
221+ size_t * canary = reinterpret_cast < size_t *>( reinterpret_cast < char *>(block) +
222+ BLOCK_METADATA_SIZE + block-> size_ );
190223
191- void * getErrorCodeInVoidPtr (size_t error_code) { return reinterpret_cast <void *>(error_code); }
224+ return (*canary == CANARY_VALUE);
225+ }
192226
193227} // namespace internal
194228} // namespace mem
0 commit comments