summaryrefslogtreecommitdiff
path: root/src/lib/libc/stdlib/malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/stdlib/malloc.c')
-rw-r--r--src/lib/libc/stdlib/malloc.c50
1 files changed, 35 insertions, 15 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c
index 67f5de512e..08b8a088d0 100644
--- a/src/lib/libc/stdlib/malloc.c
+++ b/src/lib/libc/stdlib/malloc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: malloc.c,v 1.86 2007/02/12 20:00:14 otto Exp $ */ 1/* $OpenBSD: malloc.c,v 1.87 2007/09/03 14:37:02 millert Exp $ */
2 2
3/* 3/*
4 * ---------------------------------------------------------------------------- 4 * ----------------------------------------------------------------------------
@@ -250,9 +250,9 @@ static char *malloc_func;
250/* 250/*
251 * Necessary function declarations. 251 * Necessary function declarations.
252 */ 252 */
253static void *imalloc(size_t size); 253static void *imalloc(size_t size, int zero_fill);
254static void ifree(void *ptr); 254static void ifree(void *ptr);
255static void *irealloc(void *ptr, size_t size); 255static void *irealloc(void *ptr, size_t size, int zero_fill);
256static void *malloc_bytes(size_t size); 256static void *malloc_bytes(size_t size);
257 257
258static struct pginfo *pginfo_list; 258static struct pginfo *pginfo_list;
@@ -1188,7 +1188,7 @@ malloc_bytes(size_t size)
1188 * Allocate a piece of memory 1188 * Allocate a piece of memory
1189 */ 1189 */
1190static void * 1190static void *
1191imalloc(size_t size) 1191imalloc(size_t size, int zero_fill)
1192{ 1192{
1193 void *result; 1193 void *result;
1194 int ptralloc = 0; 1194 int ptralloc = 0;
@@ -1218,7 +1218,7 @@ imalloc(size_t size)
1218 if (malloc_abort == 1 && result == NULL) 1218 if (malloc_abort == 1 && result == NULL)
1219 wrterror("allocation failed"); 1219 wrterror("allocation failed");
1220 1220
1221 if (malloc_zero && result != NULL) 1221 if ((malloc_zero || zero_fill) && result != NULL)
1222 memset(result, 0, size); 1222 memset(result, 0, size);
1223 1223
1224 if (result && ptralloc) 1224 if (result && ptralloc)
@@ -1230,7 +1230,7 @@ imalloc(size_t size)
1230 * Change the size of an allocation. 1230 * Change the size of an allocation.
1231 */ 1231 */
1232static void * 1232static void *
1233irealloc(void *ptr, size_t size) 1233irealloc(void *ptr, size_t size, int zero_fill)
1234{ 1234{
1235 void *p; 1235 void *p;
1236 size_t osize; 1236 size_t osize;
@@ -1253,7 +1253,7 @@ irealloc(void *ptr, size_t size)
1253 if (size <= PTR_SIZE) 1253 if (size <= PTR_SIZE)
1254 return (ptr); 1254 return (ptr);
1255 1255
1256 p = imalloc(size); 1256 p = imalloc(size, zero_fill);
1257 if (p) 1257 if (p)
1258 memcpy(p, ptr, PTR_SIZE); 1258 memcpy(p, ptr, PTR_SIZE);
1259 ifree(ptr); 1259 ifree(ptr);
@@ -1315,7 +1315,9 @@ irealloc(void *ptr, size_t size)
1315 1315
1316 if (!malloc_realloc && size <= osize && 1316 if (!malloc_realloc && size <= osize &&
1317 size > osize - malloc_pagesize) { 1317 size > osize - malloc_pagesize) {
1318 if (malloc_junk) 1318 if (zero_fill)
1319 memset((char *)ptr + size, 0, osize - size);
1320 else if (malloc_junk)
1319 memset((char *)ptr + size, SOME_JUNK, osize - size); 1321 memset((char *)ptr + size, SOME_JUNK, osize - size);
1320 return (ptr); /* ..don't do anything else. */ 1322 return (ptr); /* ..don't do anything else. */
1321 } 1323 }
@@ -1338,7 +1340,9 @@ irealloc(void *ptr, size_t size)
1338 1340
1339 if (!malloc_realloc && size <= osize && 1341 if (!malloc_realloc && size <= osize &&
1340 (size > osize / 2 || osize == malloc_minsize)) { 1342 (size > osize / 2 || osize == malloc_minsize)) {
1341 if (malloc_junk) 1343 if (zero_fill)
1344 memset((char *) ptr + size, 0, osize - size);
1345 else if (malloc_junk)
1342 memset((char *) ptr + size, SOME_JUNK, osize - size); 1346 memset((char *) ptr + size, SOME_JUNK, osize - size);
1343 return (ptr); /* ..don't do anything else. */ 1347 return (ptr); /* ..don't do anything else. */
1344 } 1348 }
@@ -1347,7 +1351,7 @@ irealloc(void *ptr, size_t size)
1347 return (NULL); 1351 return (NULL);
1348 } 1352 }
1349 1353
1350 p = imalloc(size); 1354 p = imalloc(size, zero_fill);
1351 1355
1352 if (p != NULL) { 1356 if (p != NULL) {
1353 /* copy the lesser of the two sizes, and free the old one */ 1357 /* copy the lesser of the two sizes, and free the old one */
@@ -1876,7 +1880,7 @@ malloc(size_t size)
1876 malloc_recurse(); 1880 malloc_recurse();
1877 return (NULL); 1881 return (NULL);
1878 } 1882 }
1879 r = imalloc(size); 1883 r = imalloc(size, 0);
1880 UTRACE(0, size, r); 1884 UTRACE(0, size, r);
1881 malloc_active--; 1885 malloc_active--;
1882 _MALLOC_UNLOCK(); 1886 _MALLOC_UNLOCK();
@@ -1907,8 +1911,8 @@ free(void *ptr)
1907 return; 1911 return;
1908} 1912}
1909 1913
1910void * 1914static void *
1911realloc(void *ptr, size_t size) 1915_realloc(void *ptr, size_t size, int zero_fill)
1912{ 1916{
1913 void *r; 1917 void *r;
1914 1918
@@ -1920,9 +1924,9 @@ realloc(void *ptr, size_t size)
1920 } 1924 }
1921 1925
1922 if (ptr == NULL) 1926 if (ptr == NULL)
1923 r = imalloc(size); 1927 r = imalloc(size, zero_fill);
1924 else 1928 else
1925 r = irealloc(ptr, size); 1929 r = irealloc(ptr, size, zero_fill);
1926 1930
1927 UTRACE(ptr, size, r); 1931 UTRACE(ptr, size, r);
1928 malloc_active--; 1932 malloc_active--;
@@ -1933,3 +1937,19 @@ realloc(void *ptr, size_t size)
1933 } 1937 }
1934 return (r); 1938 return (r);
1935} 1939}
1940
1941void *
1942realloc(void *ptr, size_t size)
1943{
1944 return (_realloc(ptr, size, 0));
1945}
1946
1947void *
1948recalloc(void *ptr, size_t nmemb, size_t size)
1949{
1950 if (nmemb && SIZE_MAX / nmemb < size) {
1951 errno = ENOMEM;
1952 return (NULL);
1953 }
1954 return (_realloc(ptr, nmemb * size, 1));
1955}