static void
realloc_array(ARR_Instance array, unsigned int min_size)
{
- size_t data_size;
-
assert(min_size <= 2 * min_size);
if (array->allocated >= min_size && array->allocated <= 2 * min_size)
return;
array->allocated = min_size;
}
- data_size = (size_t)array->elem_size * array->allocated;
- assert(data_size / array->elem_size == array->allocated);
-
- array->data = Realloc(array->data, data_size);
+ array->data = Realloc2(array->data, array->allocated, array->elem_size);
}
void *
return r;
}
+static size_t
+get_array_size(size_t nmemb, size_t size)
+{
+ size_t array_size;
+
+ array_size = nmemb * size;
+
+ /* Check for overflow */
+ if (nmemb > 0 && array_size / nmemb != size)
+ LOG_FATAL("Could not allocate memory");
+
+ return array_size;
+}
+
+void *
+Malloc2(size_t nmemb, size_t size)
+{
+ return Malloc(get_array_size(nmemb, size));
+}
+
+void *
+Realloc2(void *ptr, size_t nmemb, size_t size)
+{
+ return Realloc(ptr, get_array_size(nmemb, size));
+}
+
char *
Strdup(const char *s)
{
/* Wrappers checking for errors */
extern void *Malloc(size_t size);
extern void *Realloc(void *ptr, size_t size);
+extern void *Malloc2(size_t nmemb, size_t size);
+extern void *Realloc2(void *ptr, size_t nmemb, size_t size);
extern char *Strdup(const char *s);
/* Convenient macros */
#define MallocNew(T) ((T *) Malloc(sizeof(T)))
-#define MallocArray(T, n) ((T *) Malloc((n) * sizeof(T)))
-#define ReallocArray(T,n,x) ((T *) Realloc((void *)(x), (n)*sizeof(T)))
+#define MallocArray(T, n) ((T *) Malloc2(n, sizeof(T)))
+#define ReallocArray(T, n, x) ((T *) Realloc2((void *)(x), n, sizeof(T)))
#define Free(x) free(x)
#endif /* GOT_MEMORY_H */