]> git.proxmox.com Git - libgit2.git/blob - src/allocators/stdalloc.c
New upstream version 1.4.3+dfsg.1
[libgit2.git] / src / allocators / stdalloc.c
1 /*
2 * Copyright (C) the libgit2 contributors. All rights reserved.
3 *
4 * This file is part of libgit2, distributed under the GNU GPL v2 with
5 * a Linking Exception. For full terms see the included COPYING file.
6 */
7
8 #include "stdalloc.h"
9
10 static void *stdalloc__malloc(size_t len, const char *file, int line)
11 {
12 void *ptr;
13
14 GIT_UNUSED(file);
15 GIT_UNUSED(line);
16
17 #ifdef GIT_DEBUG_STRICT_ALLOC
18 if (!len)
19 return NULL;
20 #endif
21
22 ptr = malloc(len);
23
24 if (!ptr)
25 git_error_set_oom();
26
27 return ptr;
28 }
29
30 static void *stdalloc__calloc(size_t nelem, size_t elsize, const char *file, int line)
31 {
32 void *ptr;
33
34 GIT_UNUSED(file);
35 GIT_UNUSED(line);
36
37 #ifdef GIT_DEBUG_STRICT_ALLOC
38 if (!elsize || !nelem)
39 return NULL;
40 #endif
41
42 ptr = calloc(nelem, elsize);
43
44 if (!ptr)
45 git_error_set_oom();
46
47 return ptr;
48 }
49
50 static char *stdalloc__strdup(const char *str, const char *file, int line)
51 {
52 char *ptr;
53
54 GIT_UNUSED(file);
55 GIT_UNUSED(line);
56
57 ptr = strdup(str);
58
59 if (!ptr)
60 git_error_set_oom();
61
62 return ptr;
63 }
64
65 static char *stdalloc__strndup(const char *str, size_t n, const char *file, int line)
66 {
67 size_t length = 0, alloclength;
68 char *ptr;
69
70 length = p_strnlen(str, n);
71
72 if (GIT_ADD_SIZET_OVERFLOW(&alloclength, length, 1) ||
73 !(ptr = stdalloc__malloc(alloclength, file, line)))
74 return NULL;
75
76 if (length)
77 memcpy(ptr, str, length);
78
79 ptr[length] = '\0';
80
81 return ptr;
82 }
83
84 static char *stdalloc__substrdup(const char *start, size_t n, const char *file, int line)
85 {
86 char *ptr;
87 size_t alloclen;
88
89 if (GIT_ADD_SIZET_OVERFLOW(&alloclen, n, 1) ||
90 !(ptr = stdalloc__malloc(alloclen, file, line)))
91 return NULL;
92
93 memcpy(ptr, start, n);
94 ptr[n] = '\0';
95 return ptr;
96 }
97
98 static void *stdalloc__realloc(void *ptr, size_t size, const char *file, int line)
99 {
100 void *new_ptr;
101
102 GIT_UNUSED(file);
103 GIT_UNUSED(line);
104
105 #ifdef GIT_DEBUG_STRICT_ALLOC
106 if (!size)
107 return NULL;
108 #endif
109
110 new_ptr = realloc(ptr, size);
111
112 if (!new_ptr)
113 git_error_set_oom();
114
115 return new_ptr;
116 }
117
118 static void *stdalloc__reallocarray(void *ptr, size_t nelem, size_t elsize, const char *file, int line)
119 {
120 size_t newsize;
121
122 if (GIT_MULTIPLY_SIZET_OVERFLOW(&newsize, nelem, elsize))
123 return NULL;
124
125 return stdalloc__realloc(ptr, newsize, file, line);
126 }
127
128 static void *stdalloc__mallocarray(size_t nelem, size_t elsize, const char *file, int line)
129 {
130 return stdalloc__reallocarray(NULL, nelem, elsize, file, line);
131 }
132
133 static void stdalloc__free(void *ptr)
134 {
135 free(ptr);
136 }
137
138 int git_stdalloc_init_allocator(git_allocator *allocator)
139 {
140 allocator->gmalloc = stdalloc__malloc;
141 allocator->gcalloc = stdalloc__calloc;
142 allocator->gstrdup = stdalloc__strdup;
143 allocator->gstrndup = stdalloc__strndup;
144 allocator->gsubstrdup = stdalloc__substrdup;
145 allocator->grealloc = stdalloc__realloc;
146 allocator->greallocarray = stdalloc__reallocarray;
147 allocator->gmallocarray = stdalloc__mallocarray;
148 allocator->gfree = stdalloc__free;
149 return 0;
150 }