X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Futil.c;h=6b93e2a93bab0daf16e0c20c990fa871d7b005c7;hb=74faf510afbc0c3130035a7002cf5bc0d6d8fdcc;hp=f7ed251c784868028bf12ef2be01cd36221738d8;hpb=f3ab01445d6184f7c5ffd0251667de7ef7437f9a;p=wimlib diff --git a/src/util.c b/src/util.c index f7ed251c..6b93e2a9 100644 --- a/src/util.c +++ b/src/util.c @@ -414,7 +414,10 @@ static void *(*wimlib_realloc_func)(void *, size_t) = realloc; void * wimlib_malloc(size_t size) { - return (*wimlib_malloc_func)(size); + void *ptr = (*wimlib_malloc_func)(size); + if (ptr == NULL && size != 0) + ERROR("memory exhausted"); + return ptr; } void @@ -426,14 +429,17 @@ wimlib_free_memory(void *ptr) void * wimlib_realloc(void *ptr, size_t size) { - return (*wimlib_realloc_func)(ptr, size); + ptr = (*wimlib_realloc_func)(ptr, size); + if (ptr == NULL && size != 0) + ERROR("memory exhausted"); + return ptr; } void * wimlib_calloc(size_t nmemb, size_t size) { size_t total_size = nmemb * size; - void *p = (*wimlib_malloc_func)(total_size); + void *p = MALLOC(total_size); if (p) p = memset(p, 0, total_size); return p; @@ -446,9 +452,9 @@ wimlib_strdup(const char *str) char *p; size = strlen(str); - p = (*wimlib_malloc_func)(size + 1); + p = MALLOC(size + 1); if (p) - memcpy(p, str, size + 1); + p = memcpy(p, str, size + 1); return p; } @@ -460,7 +466,7 @@ wimlib_wcsdup(const wchar_t *str) wchar_t *p; size = wcslen(str); - p = (*wimlib_malloc_func)((size + 1) * sizeof(wchar_t)); + p = MALLOC((size + 1) * sizeof(wchar_t)); if (p) p = wmemcpy(p, str, size + 1); return p; @@ -469,6 +475,15 @@ wimlib_wcsdup(const wchar_t *str) #endif /* ENABLE_CUSTOM_MEMORY_ALLOCATOR */ +void * +memdup(const void *mem, size_t size) +{ + void *ptr = MALLOC(size); + if (ptr) + ptr = memcpy(ptr, mem, size); + return ptr; +} + WIMLIBAPI int wimlib_set_memory_allocator(void *(*malloc_func)(size_t), void (*free_func)(void *),