@@ -63,6 +63,7 @@ static bool time_limited = false;
63
63
typedef enum {
64
64
TEST_MALLOC ,
65
65
TEST_CALLOC ,
66
+ TEST_REALLOC ,
66
67
} alloc_t ;
67
68
68
69
/* Internal functions */
@@ -128,6 +129,7 @@ static void *alloc(alloc_t alloc_type, size_t size)
128
129
char * msg_alloc_forbidden [] = {
129
130
"Calls to malloc are disallowed" ,
130
131
"Calls to calloc are disallowed" ,
132
+ "Calls to realloc are disallowed" ,
131
133
};
132
134
report_event (MSG_FATAL , "%s" , msg_alloc_forbidden [alloc_type ]);
133
135
return NULL ;
@@ -137,6 +139,7 @@ static void *alloc(alloc_t alloc_type, size_t size)
137
139
char * msg_alloc_failure [] = {
138
140
"Malloc returning NULL" ,
139
141
"Calloc returning NULL" ,
142
+ "Realloc returning NULL" ,
140
143
};
141
144
report_event (MSG_WARN , "%s" , msg_alloc_failure [alloc_type ]);
142
145
return NULL ;
@@ -187,6 +190,28 @@ void *test_calloc(size_t nelem, size_t elsize)
187
190
return alloc (TEST_CALLOC , nelem * elsize );
188
191
}
189
192
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
+
190
215
void test_free (void * p )
191
216
{
192
217
if (noallocate_mode ) {
0 commit comments