Module Name:    src
Committed By:   joerg
Date:           Tue Feb 17 20:29:21 UTC 2015

Modified Files:
        src/distrib/sets/lists/comp: mi
        src/include: stdlib.h
        src/lib/libc/include: namespace.h
        src/lib/libc/stdlib: Makefile.inc
Added Files:
        src/lib/libc/stdlib: reallocarr.3 reallocarr.c

Log Message:
Introduce reallocarr(3) for easy (re)allocation of memory with overflow
checks. Compared to OpenBSD's reallocarray, makes it easier to avoid memory
leaks on allocation failures and it doesn't depend on malloc(0) != NULL
for correct error checking. Compared to plain realloc, it also avoids
the problem of intermediate integer overflows. The trade-off is the use
of void * to side step C type system with regard to generic pointer to
pointer.


To generate a diff of this commit:
cvs rdiff -u -r1.1946 -r1.1947 src/distrib/sets/lists/comp/mi
cvs rdiff -u -r1.113 -r1.114 src/include/stdlib.h
cvs rdiff -u -r1.176 -r1.177 src/lib/libc/include/namespace.h
cvs rdiff -u -r1.88 -r1.89 src/lib/libc/stdlib/Makefile.inc
cvs rdiff -u -r0 -r1.1 src/lib/libc/stdlib/reallocarr.3 \
    src/lib/libc/stdlib/reallocarr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/sets/lists/comp/mi
diff -u src/distrib/sets/lists/comp/mi:1.1946 src/distrib/sets/lists/comp/mi:1.1947
--- src/distrib/sets/lists/comp/mi:1.1946	Tue Feb 10 19:11:52 2015
+++ src/distrib/sets/lists/comp/mi	Tue Feb 17 20:29:20 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: mi,v 1.1946 2015/02/10 19:11:52 rjs Exp $
+#	$NetBSD: mi,v 1.1947 2015/02/17 20:29:20 joerg Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -8766,6 +8766,7 @@
 ./usr/share/man/cat3/re_exec.0			comp-c-catman		.cat
 ./usr/share/man/cat3/readdir.0			comp-c-catman		.cat
 ./usr/share/man/cat3/readdir_r.0		comp-c-catman		.cat
+./usr/share/man/cat3/reallocarr.0		comp-c-catman		.cat
 ./usr/share/man/cat3/reallocarray.0		comp-c-catman		.cat
 ./usr/share/man/cat3/realloc.0			comp-c-catman		.cat
 ./usr/share/man/cat3/realpath.0			comp-c-catman		.cat
@@ -15606,6 +15607,7 @@
 ./usr/share/man/html3/re_exec.html		comp-c-htmlman		html
 ./usr/share/man/html3/readdir.html		comp-c-htmlman		html
 ./usr/share/man/html3/readdir_r.html		comp-c-htmlman		html
+./usr/share/man/html3/reallocarr.html		comp-c-htmlman		html
 ./usr/share/man/html3/reallocarray.html		comp-c-htmlman		html
 ./usr/share/man/html3/realloc.html		comp-c-htmlman		html
 ./usr/share/man/html3/realpath.html		comp-c-htmlman		html
@@ -22445,6 +22447,7 @@
 ./usr/share/man/man3/re_exec.3			comp-c-man		.man
 ./usr/share/man/man3/readdir.3			comp-c-man		.man
 ./usr/share/man/man3/readdir_r.3		comp-c-man		.man
+./usr/share/man/man3/reallocarr.3		comp-c-man		.man
 ./usr/share/man/man3/reallocarray.3		comp-c-man		.man
 ./usr/share/man/man3/realloc.3			comp-c-man		.man
 ./usr/share/man/man3/realpath.3			comp-c-man		.man

Index: src/include/stdlib.h
diff -u src/include/stdlib.h:1.113 src/include/stdlib.h:1.114
--- src/include/stdlib.h:1.113	Thu Feb  5 16:05:46 2015
+++ src/include/stdlib.h	Tue Feb 17 20:29:20 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: stdlib.h,v 1.113 2015/02/05 16:05:46 christos Exp $	*/
+/*	$NetBSD: stdlib.h,v 1.114 2015/02/17 20:29:20 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -337,6 +337,8 @@ int	 l64a_r(long, char *, int);
 
 size_t	shquote(const char *, char *, size_t);
 size_t	shquotev(int, char * const *, char *, size_t);
+
+int	reallocarr(void *, size_t, size_t);
 #endif /* _NETBSD_SOURCE */
 #endif /* _POSIX_C_SOURCE || _XOPEN_SOURCE || _NETBSD_SOURCE */
 

Index: src/lib/libc/include/namespace.h
diff -u src/lib/libc/include/namespace.h:1.176 src/lib/libc/include/namespace.h:1.177
--- src/lib/libc/include/namespace.h:1.176	Fri Sep 26 19:28:03 2014
+++ src/lib/libc/include/namespace.h	Tue Feb 17 20:29:21 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: namespace.h,v 1.176 2014/09/26 19:28:03 christos Exp $	*/
+/*	$NetBSD: namespace.h,v 1.177 2015/02/17 20:29:21 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
@@ -547,6 +547,7 @@
 #define readdir			_readdir
 #define readdir_r		_readdir_r
 #define readlink		_readlink
+#define reallocarr		_reallocarr
 #define realpath		_realpath
 #define regcomp			_regcomp
 #define regerror		_regerror

Index: src/lib/libc/stdlib/Makefile.inc
diff -u src/lib/libc/stdlib/Makefile.inc:1.88 src/lib/libc/stdlib/Makefile.inc:1.89
--- src/lib/libc/stdlib/Makefile.inc:1.88	Thu Feb  5 20:02:28 2015
+++ src/lib/libc/stdlib/Makefile.inc	Tue Feb 17 20:29:21 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.88 2015/02/05 20:02:28 christos Exp $
+#	$NetBSD: Makefile.inc,v 1.89 2015/02/17 20:29:21 joerg Exp $
 #	from: @(#)Makefile.inc	8.3 (Berkeley) 2/4/95
 
 # stdlib sources
@@ -12,7 +12,7 @@ SRCS+=	_env.c _rand48.c \
 	lcong48.c lrand48.c lsearch.c merge.c mi_vector_hash.c mrand48.c \
 	nrand48.c putenv.c qabs.c qdiv.c qsort.c posix_openpt.c pty.c \
 	quick_exit.c radixsort.c rand.c rand_r.c random.c remque.c \
-	reallocarray.c seed48.c setenv.c srand48.c strsuftoll.c \
+	reallocarr.c reallocarray.c seed48.c setenv.c srand48.c strsuftoll.c \
 	strtoi.c strtou.c strtonum.c \
 	strtoimax.c strtol.c strtoll.c strtoq.c strtoul.c strtoull.c \
 	strtoumax.c strtouq.c system.c tdelete.c tfind.c tsearch.c twalk.c \
@@ -52,7 +52,7 @@ MAN+=	a64l.3 abort.3 abs.3 alloca.3 atex
 	malloc.3 memory.3 mi_vector_hash.3 \
 	posix_memalign.3 posix_openpt.3 ptsname.3 \
 	qabs.3 qdiv.3 quick_exit.3 qsort.3 \
-	radixsort.3 rand48.3 rand.3 random.3 reallocarray.3 \
+	radixsort.3 rand48.3 rand.3 random.3 reallocarr.3 reallocarray.3 \
 	strfmon.3 strsuftoll.3 strtod.3 strtol.3 strtoul.3 strtonum.3 \
 	system.3 \
 	tsearch.3 \

Added files:

Index: src/lib/libc/stdlib/reallocarr.3
diff -u /dev/null src/lib/libc/stdlib/reallocarr.3:1.1
--- /dev/null	Tue Feb 17 20:29:21 2015
+++ src/lib/libc/stdlib/reallocarr.3	Tue Feb 17 20:29:21 2015
@@ -0,0 +1,67 @@
+.\"	$NetBSD: reallocarr.3,v 1.1 2015/02/17 20:29:21 joerg Exp $
+.\"
+.\" Copyright (c) 2015 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\"
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+.\" COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.Dd February 5, 2015
+.Dt REALLOCARR 3
+.Os
+.Sh NAME
+.Nm reallocarr
+.Nd reallocate array
+.Sh SYNOPSIS
+.In stdlib.h
+.Ft int
+.Fo reallocarr
+.Fa "void *ptr"
+.Fa "size_t num"
+.Fa "size_t size"
+.Fc
+.Sh DESCRIPTION
+The
+.Nm
+function reallocates the memory in
+.Fa *ptr .
+.Sh RETURN VALUES
+On successful completion,
+.Fn
+returns 0 and updates
+.Fa *ptr .
+Otherwise, an error code (see
+.Xr errno 7 )
+is returned and
+.Fa *ptr
+and the referenced memory is unmodified.
+.Sh SEE ALSO
+.Xr calloc 3
+.Sh HISTORY
+.Nm
+first appeared in
+.Nx 7.0 .
+.Ox introduced the
+.Xr reallocarray 3
+function for the same purpose, but the interface makes it difficult
+to correctly handle zero-sized allocations.
Index: src/lib/libc/stdlib/reallocarr.c
diff -u /dev/null src/lib/libc/stdlib/reallocarr.c:1.1
--- /dev/null	Tue Feb 17 20:29:21 2015
+++ src/lib/libc/stdlib/reallocarr.c	Tue Feb 17 20:29:21 2015
@@ -0,0 +1,78 @@
+/* $NetBSD: reallocarr.c,v 1.1 2015/02/17 20:29:21 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2015 Joerg Sonnenberger <jo...@netbsd.org>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: reallocarr.c,v 1.1 2015/02/17 20:29:21 joerg Exp $");
+
+#include "namespace.h"
+#include <errno.h>
+/* Old POSIX has SIZE_MAX in limits.h */
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+__CTASSERT(65535 < SIZE_MAX / 65535);
+
+#ifdef _LIBC
+#ifdef __weak_alias
+__weak_alias(reallocarr, _reallocarr)
+#endif
+#endif
+
+int
+reallocarr(void *ptr, size_t num, size_t size)
+{
+	int saved_errno, result;
+	void *optr;
+	void *nptr;
+
+	memcpy(&optr, ptr, sizeof(ptr));
+	saved_errno = errno;
+	if (num == 0 || size == 0) {
+		free(optr);
+		nptr = NULL;
+		memcpy(ptr, &nptr, sizeof(ptr));
+		errno = saved_errno;
+		return 0;
+	}
+	if ((num >= 65535 || size >= 65535) && num > SIZE_MAX / size)
+		return EOVERFLOW;
+	nptr = realloc(optr, num * size);
+	if (nptr == NULL) {
+		result = errno;
+	} else {
+		result = 0;
+		memcpy(ptr, &nptr, sizeof(ptr));
+	}
+	errno = saved_errno;
+	return result;
+}

Reply via email to