]> wimlib.net Git - wimlib/blobdiff - src/util.c
Misc. fixes
[wimlib] / src / util.c
index f7ed251c784868028bf12ef2be01cd36221738d8..6b93e2a93bab0daf16e0c20c990fa871d7b005c7 100644 (file)
@@ -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 *),