errors: Set error messages on memory allocation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
diff --git a/src/common.h b/src/common.h
index b3f5253..351d669 100644
--- a/src/common.h
+++ b/src/common.h
@@ -50,12 +50,12 @@ typedef SSIZE_T ssize_t;
#include "git2/common.h"
#include "git2/types.h"
-#include "util.h"
#include "thread-utils.h"
#include "bswap.h"
#define GIT_PATH_MAX 4096
-
extern int git__error(int error, const char *, ...) GIT_FORMAT_PRINTF(2, 3);
+#include "util.h"
+
#endif /* INCLUDE_common_h__ */
diff --git a/src/util.h b/src/util.h
index 3c60649..f5f0b86 100644
--- a/src/util.h
+++ b/src/util.h
@@ -6,16 +6,41 @@
#define MSB(x, bits) ((x) & (~0ULL << (bitsizeof(x) - (bits))))
/*
- * Don't wrap malloc/calloc.
- * Use the default versions in glibc, and make
- * sure that any methods that allocate memory
- * return a GIT_ENOMEM error when allocation
- * fails.
+ * Custom memory allocation wrappers
+ * that set error code and error message
+ * on allocation failure
*/
-#define git__malloc malloc
-#define git__calloc calloc
-#define git__realloc realloc
-#define git__strdup strdup
+GIT_INLINE(void *) git__malloc(size_t len)
+{
+ void *ptr = malloc(len);
+ if (!ptr)
+ git__error(GIT_ENOMEM, "Out of memory. Failed to allocate %d bytes.", (int)len);
+ return ptr;
+}
+
+GIT_INLINE(void *) git__calloc(size_t nelem, size_t elsize)
+{
+ void *ptr = calloc(nelem, elsize);
+ if (!ptr)
+ git__error(GIT_ENOMEM, "Out of memory. Failed to allocate %d bytes.", (int)elsize);
+ return ptr;
+}
+
+GIT_INLINE(char *) git__strdup(const char *str)
+{
+ char *ptr = strdup(str);
+ if (!ptr)
+ git__error(GIT_ENOMEM, "Out of memory. Failed to duplicate string");
+ return ptr;
+}
+
+GIT_INLINE(void *) git__realloc(void *ptr, size_t size)
+{
+ void *new_ptr = realloc(ptr, size);
+ if (!new_ptr)
+ git__error(GIT_ENOMEM, "Out of memory. Failed to allocate %d bytes.", (int)size);
+ return new_ptr;
+}
extern int git__fmt(char *, size_t, const char *, ...)
GIT_FORMAT_PRINTF(3, 4);