@@ -63,6 +63,7 @@ static bool time_limited = false;
6363typedef enum {
6464 TEST_MALLOC ,
6565 TEST_CALLOC ,
66+ TEST_REALLOC ,
6667} alloc_t ;
6768
6869/* Internal functions */
@@ -128,6 +129,7 @@ static void *alloc(alloc_t alloc_type, size_t size)
128129 char * msg_alloc_forbidden [] = {
129130 "Calls to malloc are disallowed" ,
130131 "Calls to calloc are disallowed" ,
132+ "Calls to realloc are disallowed" ,
131133 };
132134 report_event (MSG_FATAL , "%s" , msg_alloc_forbidden [alloc_type ]);
133135 return NULL ;
@@ -137,6 +139,7 @@ static void *alloc(alloc_t alloc_type, size_t size)
137139 char * msg_alloc_failure [] = {
138140 "Malloc returning NULL" ,
139141 "Calloc returning NULL" ,
142+ "Realloc returning NULL" ,
140143 };
141144 report_event (MSG_WARN , "%s" , msg_alloc_failure [alloc_type ]);
142145 return NULL ;
@@ -187,6 +190,28 @@ void *test_calloc(size_t nelem, size_t elsize)
187190 return alloc (TEST_CALLOC , nelem * elsize );
188191}
189192
193+ /*
194+ * Implementation of adjusting the size of the memory allocated
195+ * by test_malloc or test_calloc.
196+ */
197+ void * test_realloc (void * p , size_t new_size )
198+ {
199+ if (!p )
200+ return alloc (TEST_REALLOC , new_size );
201+
202+ const block_element_t * b = find_header (p );
203+ if (b -> payload_size >= new_size )
204+ return p ;
205+
206+ void * new_ptr = alloc (TEST_REALLOC , new_size );
207+ if (!new_ptr )
208+ return NULL ;
209+ memcpy (new_ptr , p , b -> payload_size );
210+ test_free (p );
211+
212+ return new_ptr ;
213+ }
214+
190215void test_free (void * p )
191216{
192217 if (noallocate_mode ) {
0 commit comments