Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Oct 2025 17:48:32 GMT
From:      Robert Clausecker <fuz@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 42664610795b - main - lib/libc: add recallocarray()
Message-ID:  <202510031748.593HmWeI060844@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by fuz:

URL: https://cgit.FreeBSD.org/src/commit/?id=42664610795bc0a728851ba6223fcf9b93801167

commit 42664610795bc0a728851ba6223fcf9b93801167
Author:     Robert Clausecker <fuz@FreeBSD.org>
AuthorDate: 2025-10-02 14:33:55 +0000
Commit:     Robert Clausecker <fuz@FreeBSD.org>
CommitDate: 2025-10-03 17:46:55 +0000

    lib/libc: add recallocarray()
    
    This function from OpenBSD is a hybrid of reallocarray() and calloc().
    It reallocates an array, clearing any newly allocated items.
    reallocarray() ultimately originates from OpenBSD.
    
    The source is taken from lib/libopenbsd, which now no longer has the
    function unless when bootstrapping (needed for mandoc).
    
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D52863
---
 include/stdlib.h                                |  2 ++
 lib/libc/stdlib/Makefile.inc                    |  3 +-
 lib/libc/stdlib/Symbol.map                      |  4 +++
 lib/libc/stdlib/reallocarray.3                  | 37 ++++++++++++++++++++++++-
 lib/{libopenbsd => libc/stdlib}/recallocarray.c |  0
 lib/libopenbsd/Makefile                         |  8 ++++--
 6 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/include/stdlib.h b/include/stdlib.h
index ba0cf4b5e88e..784cb63bfc5b 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -314,6 +314,8 @@ int	 radixsort(const unsigned char **, int, const unsigned char *,
 	    unsigned);
 void	*reallocarray(void *, size_t, size_t) __result_use_check
 	    __alloc_size2(2, 3);
+void	*recallocarray(void *, size_t, size_t, size_t) __result_use_check
+	    __alloc_size2(3, 4);
 void	*reallocf(void *, size_t) __result_use_check __alloc_size(2);
 int	 rpmatch(const char *);
 char	*secure_getenv(const char *);
diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makefile.inc
index ca199a669be1..e7b9955b9646 100644
--- a/lib/libc/stdlib/Makefile.inc
+++ b/lib/libc/stdlib/Makefile.inc
@@ -10,7 +10,7 @@ MISRCS+=C99_Exit.c a64l.c abort.c abs.c atexit.c atof.c atoi.c atol.c atoll.c \
 	insque.c l64a.c labs.c ldiv.c llabs.c lldiv.c lsearch.c \
 	merge.c mergesort_b.c ptsname.c qsort.c qsort_r.c qsort_r_compat.c \
 	qsort_s.c quick_exit.c radixsort.c rand.c \
-	random.c reallocarray.c reallocf.c realpath.c remque.c \
+	random.c reallocarray.c reallocf.c realpath.c recallocarray.c remque.c \
 	set_constraint_handler_s.c strfmon.c strtoimax.c \
 	strtol.c strtold.c strtoll.c strtoq.c strtoul.c strtonum.c strtoull.c \
 	strtoumax.c strtouq.c system.c tdelete.c tfind.c tsearch.c twalk.c
@@ -76,6 +76,7 @@ MLINKS+=random.3 initstate.3 \
 	random.3 srandom.3 \
 	random.3 srandomdev.3
 MLINKS+=radixsort.3 sradixsort.3
+MLINKS+=reallocarray.3 recallocarray.3
 MLINKS+=set_constraint_handler_s.3 abort_handler_s.3
 MLINKS+=set_constraint_handler_s.3 ignore_handler_s.3
 MLINKS+=strfmon.3 strfmon_l.3
diff --git a/lib/libc/stdlib/Symbol.map b/lib/libc/stdlib/Symbol.map
index 2b79ca2ece8b..53d71bcafb7d 100644
--- a/lib/libc/stdlib/Symbol.map
+++ b/lib/libc/stdlib/Symbol.map
@@ -131,6 +131,10 @@ FBSD_1.8 {
 	getenv_r;
 };
 
+FBSD_1.9 {
+	recallocarray;
+};
+
 FBSDprivate_1.0 {
 	__system;
 	_system;
diff --git a/lib/libc/stdlib/reallocarray.3 b/lib/libc/stdlib/reallocarray.3
index 80035c67a497..9a2ab5c7a840 100644
--- a/lib/libc/stdlib/reallocarray.3
+++ b/lib/libc/stdlib/reallocarray.3
@@ -26,7 +26,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd May 1, 2015
+.Dd October 2, 2025
 .Dt REALLOCARRAY 3
 .Os
 .Sh NAME
@@ -38,6 +38,8 @@
 .In stdlib.h
 .Ft void *
 .Fn reallocarray "void *ptr" "size_t nmemb" "size_t size"
+.Ft void *
+.Fn recallocarray "void *ptr" "size_t oldnmeb" "size_t nmemb" size_t size"
 .Sh DESCRIPTION
 The
 .Fn reallocarray
@@ -52,6 +54,33 @@ and checks for integer overflow in the calculation
 .Fa nmemb
 *
 .Fa size .
+.Pp
+The
+.Fn recallocarray
+function is similar to the
+.Fn reallocarray
+function
+except it ensures newly allocated memory is cleared similar to
+.Fn calloc .
+If
+.Fa ptr
+is
+.Dv NULL ,
+.Fa oldnmemb
+is ignored and the call	is equivalent to
+.Fn calloc .
+If
+.Fa ptr
+is not
+.Dv NULL ,
+.Fa oldnmemb
+must be a value such that
+.Fa oldnmemb
+*
+.Fa size
+is the size of the earlier allocation that returned
+.Fa ptr ,
+otherwise the behaviour is undefined.
 .Sh RETURN VALUES
 The
 .Fn reallocarray
@@ -142,3 +171,9 @@ function first appeared in
 .Ox 5.6
 and
 .Fx 11.0 .
+The
+.Fn recallocarray
+function first appeared in
+.Ox 6.1
+and
+.Fx 16.0 .
diff --git a/lib/libopenbsd/recallocarray.c b/lib/libc/stdlib/recallocarray.c
similarity index 100%
rename from lib/libopenbsd/recallocarray.c
rename to lib/libc/stdlib/recallocarray.c
diff --git a/lib/libopenbsd/Makefile b/lib/libopenbsd/Makefile
index 53bd0200934f..80ae0f90621a 100644
--- a/lib/libopenbsd/Makefile
+++ b/lib/libopenbsd/Makefile
@@ -1,8 +1,12 @@
 LIB=	openbsd
 SRCS=	imsg-buffer.c \
 	imsg.c \
-	ohash.c \
-	recallocarray.c
+	ohash.c
+.if defined(BOOTSTRAPPING)
+.PATH:	${SRCTOP}/lib/libc/stdlib
+SRCS+=	recallocarray.c
+.endif
+
 .if !defined(BOOTSTRAPPING)
 # Skip getdtablecount.c when bootstrapping since it doesn't compile for Linux
 # and is not used by any of the bootstrap tools



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202510031748.593HmWeI060844>