Browse Source

change mallocarray to reallocarray. useful in a few more situations.

malloc can, as always, be emulated via realloc(NULL).
ok deraadt
OPENBSD_5_6
tedu 10 years ago
parent
commit
07d1cf3ec2
4 changed files with 16 additions and 19 deletions
  1. +2
    -2
      src/include/stdlib.h
  2. +2
    -2
      src/lib/libc/stdlib/Makefile.inc
  3. +9
    -12
      src/lib/libc/stdlib/malloc.3
  4. +3
    -3
      src/lib/libc/stdlib/malloc.c

+ 2
- 2
src/include/stdlib.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: stdlib.h,v 1.57 2014/04/21 13:17:32 deraadt Exp $ */
/* $OpenBSD: stdlib.h,v 1.58 2014/04/22 14:26:26 tedu Exp $ */
/* $NetBSD: stdlib.h,v 1.25 1995/12/27 21:19:08 jtc Exp $ */
/*-
@ -125,7 +125,7 @@ long labs(long);
ldiv_t ldiv(long, long);
void *malloc(size_t);
#if __BSD_VISIBLE
void *mallocarray(size_t, size_t);
void *reallocarray(void *, size_t, size_t);
#endif /* __BSD_VISIBLE */
void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
int rand(void);


+ 2
- 2
src/lib/libc/stdlib/Makefile.inc View File

@ -1,4 +1,4 @@
# $OpenBSD: Makefile.inc,v 1.51 2014/04/21 13:21:57 deraadt Exp $
# $OpenBSD: Makefile.inc,v 1.52 2014/04/22 14:26:26 tedu Exp $
# stdlib sources
.PATH: ${LIBCSRCDIR}/arch/${MACHINE_CPU}/stdlib ${LIBCSRCDIR}/stdlib
@ -44,7 +44,7 @@ MLINKS+=insque.3 remque.3
MLINKS+=labs.3 llabs.3
MLINKS+=lsearch.3 lfind.3
MLINKS+=malloc.3 free.3 malloc.3 realloc.3 malloc.3 calloc.3
MLINKS+=malloc.3 mallocarray.3 malloc.3 cfree.3 malloc.3 malloc.conf.5
MLINKS+=malloc.3 reallocarray.3 malloc.3 cfree.3 malloc.3 malloc.conf.5
MLINKS+=qsort.3 heapsort.3 qsort.3 mergesort.3
MLINKS+=radixsort.3 sradixsort.3
MLINKS+=rand.3 srand.3 rand.3 rand_r.3


+ 9
- 12
src/lib/libc/stdlib/malloc.3 View File

@ -30,15 +30,15 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" $OpenBSD: malloc.3,v 1.74 2014/04/21 13:17:32 deraadt Exp $
.\" $OpenBSD: malloc.3,v 1.75 2014/04/22 14:26:26 tedu Exp $
.\"
.Dd $Mdocdate: April 21 2014 $
.Dd $Mdocdate: April 22 2014 $
.Dt MALLOC 3
.Os
.Sh NAME
.Nm malloc ,
.Nm calloc ,
.Nm mallocarray ,
.Nm reallocarray ,
.Nm realloc ,
.Nm free ,
.Nm cfree
@ -50,7 +50,7 @@
.Ft void *
.Fn calloc "size_t nmemb" "size_t size"
.Ft void *
.Fn mallocarray "size_t nmemb" "size_t size"
.Fn reallocarray "void *ptr" "size_t nmemb" "size_t size"
.Ft void *
.Fn realloc "void *ptr" "size_t size"
.Ft void
@ -96,10 +96,10 @@ if ((p = malloc(num * size)) == NULL)
.Pp
The multiplication may lead to an integer overflow, which can
be avoided using the extension
.Fn mallocarray ,
.Fn reallocarray ,
as follows:
.Bd -literal -offset indent
if ((p = mallocarray(num, size)) == NULL)
if ((p = reallocarray(NULL, num, size)) == NULL)
err(1, "malloc");
.Ed
.Pp
@ -125,6 +125,8 @@ objects, each of whose size is
.Fa size .
The space is initialized to zero.
The use of
.Fn reallocarray
or
.Fn calloc
is strongly encouraged when allocating multiple sized objects
in order to avoid possible integer overflows.
@ -309,11 +311,6 @@ malloc_options = "X";
.Pp
Note that this will cause code that is supposed to handle
out-of-memory conditions gracefully to abort instead.
.It Cm Z
.Dq Zero .
Fill some junk into the area allocated (see
.Cm J ) ,
except for the exact length the user asked for, which is zeroed.
.It Cm <
.Dq Half the cache size .
Decrease the size of the free page cache by a factor of two.
@ -494,6 +491,6 @@ random.
A rewrite by Otto Moerbeek introducing a new central data structure and more
randomization appeared in
.Ox 4.4 .
.Fn mallocarray
.Fn reallocarray
appeared in
.Ox 5.6 .

+ 3
- 3
src/lib/libc/stdlib/malloc.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: malloc.c,v 1.154 2014/04/21 13:17:32 deraadt Exp $ */
/* $OpenBSD: malloc.c,v 1.155 2014/04/22 14:26:26 tedu Exp $ */
/*
* Copyright (c) 2008, 2010, 2011 Otto Moerbeek <otto@drijf.net>
* Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org>
@ -1433,14 +1433,14 @@ calloc(size_t nmemb, size_t size)
}
void *
mallocarray(size_t nmemb, size_t size)
reallocarray(void *optr, size_t nmemb, size_t size)
{
if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
nmemb > 0 && SIZE_MAX / nmemb < size) {
errno = ENOMEM;
return NULL;
}
return malloc(size * nmemb);
return realloc(optr, size * nmemb);
}
static void *


Loading…
Cancel
Save