summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdlib/malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/stdlib/malloc.c')
-rw-r--r--lib/libc/stdlib/malloc.c50
1 files changed, 35 insertions, 15 deletions
diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c
index 67f5de512ef..08b8a088d0d 100644
--- a/lib/libc/stdlib/malloc.c
+++ b/lib/libc/stdlib/malloc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: malloc.c,v 1.86 2007/02/12 20:00:14 otto Exp $ */
+/* $OpenBSD: malloc.c,v 1.87 2007/09/03 14:37:02 millert Exp $ */
/*
* ----------------------------------------------------------------------------
@@ -250,9 +250,9 @@ static char *malloc_func;
/*
* Necessary function declarations.
*/
-static void *imalloc(size_t size);
+static void *imalloc(size_t size, int zero_fill);
static void ifree(void *ptr);
-static void *irealloc(void *ptr, size_t size);
+static void *irealloc(void *ptr, size_t size, int zero_fill);
static void *malloc_bytes(size_t size);
static struct pginfo *pginfo_list;
@@ -1188,7 +1188,7 @@ malloc_bytes(size_t size)
* Allocate a piece of memory
*/
static void *
-imalloc(size_t size)
+imalloc(size_t size, int zero_fill)
{
void *result;
int ptralloc = 0;
@@ -1218,7 +1218,7 @@ imalloc(size_t size)
if (malloc_abort == 1 && result == NULL)
wrterror("allocation failed");
- if (malloc_zero && result != NULL)
+ if ((malloc_zero || zero_fill) && result != NULL)
memset(result, 0, size);
if (result && ptralloc)
@@ -1230,7 +1230,7 @@ imalloc(size_t size)
* Change the size of an allocation.
*/
static void *
-irealloc(void *ptr, size_t size)
+irealloc(void *ptr, size_t size, int zero_fill)
{
void *p;
size_t osize;
@@ -1253,7 +1253,7 @@ irealloc(void *ptr, size_t size)
if (size <= PTR_SIZE)
return (ptr);
- p = imalloc(size);
+ p = imalloc(size, zero_fill);
if (p)
memcpy(p, ptr, PTR_SIZE);
ifree(ptr);
@@ -1315,7 +1315,9 @@ irealloc(void *ptr, size_t size)
if (!malloc_realloc && size <= osize &&
size > osize - malloc_pagesize) {
- if (malloc_junk)
+ if (zero_fill)
+ memset((char *)ptr + size, 0, osize - size);
+ else if (malloc_junk)
memset((char *)ptr + size, SOME_JUNK, osize - size);
return (ptr); /* ..don't do anything else. */
}
@@ -1338,7 +1340,9 @@ irealloc(void *ptr, size_t size)
if (!malloc_realloc && size <= osize &&
(size > osize / 2 || osize == malloc_minsize)) {
- if (malloc_junk)
+ if (zero_fill)
+ memset((char *) ptr + size, 0, osize - size);
+ else if (malloc_junk)
memset((char *) ptr + size, SOME_JUNK, osize - size);
return (ptr); /* ..don't do anything else. */
}
@@ -1347,7 +1351,7 @@ irealloc(void *ptr, size_t size)
return (NULL);
}
- p = imalloc(size);
+ p = imalloc(size, zero_fill);
if (p != NULL) {
/* copy the lesser of the two sizes, and free the old one */
@@ -1876,7 +1880,7 @@ malloc(size_t size)
malloc_recurse();
return (NULL);
}
- r = imalloc(size);
+ r = imalloc(size, 0);
UTRACE(0, size, r);
malloc_active--;
_MALLOC_UNLOCK();
@@ -1907,8 +1911,8 @@ free(void *ptr)
return;
}
-void *
-realloc(void *ptr, size_t size)
+static void *
+_realloc(void *ptr, size_t size, int zero_fill)
{
void *r;
@@ -1920,9 +1924,9 @@ realloc(void *ptr, size_t size)
}
if (ptr == NULL)
- r = imalloc(size);
+ r = imalloc(size, zero_fill);
else
- r = irealloc(ptr, size);
+ r = irealloc(ptr, size, zero_fill);
UTRACE(ptr, size, r);
malloc_active--;
@@ -1933,3 +1937,19 @@ realloc(void *ptr, size_t size)
}
return (r);
}
+
+void *
+realloc(void *ptr, size_t size)
+{
+ return (_realloc(ptr, size, 0));
+}
+
+void *
+recalloc(void *ptr, size_t nmemb, size_t size)
+{
+ if (nmemb && SIZE_MAX / nmemb < size) {
+ errno = ENOMEM;
+ return (NULL);
+ }
+ return (_realloc(ptr, nmemb * size, 1));
+}