166932323SSascha Wildner.\" Copyright (c) 1980, 1991, 1993 266932323SSascha Wildner.\" The Regents of the University of California. All rights reserved. 366932323SSascha Wildner.\" 466932323SSascha Wildner.\" This code is derived from software contributed to Berkeley by 566932323SSascha Wildner.\" the American National Standards Committee X3, on Information 666932323SSascha Wildner.\" Processing Systems. 766932323SSascha Wildner.\" 866932323SSascha Wildner.\" Redistribution and use in source and binary forms, with or without 966932323SSascha Wildner.\" modification, are permitted provided that the following conditions 1066932323SSascha Wildner.\" are met: 1166932323SSascha Wildner.\" 1. Redistributions of source code must retain the above copyright 1266932323SSascha Wildner.\" notice, this list of conditions and the following disclaimer. 1366932323SSascha Wildner.\" 2. Redistributions in binary form must reproduce the above copyright 1466932323SSascha Wildner.\" notice, this list of conditions and the following disclaimer in the 1566932323SSascha Wildner.\" documentation and/or other materials provided with the distribution. 1666932323SSascha Wildner.\" 1766932323SSascha Wildner.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 1866932323SSascha Wildner.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1966932323SSascha Wildner.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2066932323SSascha Wildner.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2166932323SSascha Wildner.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2266932323SSascha Wildner.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2366932323SSascha Wildner.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2466932323SSascha Wildner.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2566932323SSascha Wildner.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2666932323SSascha Wildner.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2766932323SSascha Wildner.\" SUCH DAMAGE. 2866932323SSascha Wildner.\" 2966932323SSascha Wildner.\" $FreeBSD: head/lib/libc/stdlib/reallocarray.3 282472 2015-05-05 10:44:17Z pluknet $ 3066932323SSascha Wildner.\" 3164c3fdb4Szrj.Dd April 11, 2019 3266932323SSascha Wildner.Dt REALLOCARRAY 3 3366932323SSascha Wildner.Os 3466932323SSascha Wildner.Sh NAME 3564c3fdb4Szrj.Nm reallocarray , 3664c3fdb4Szrj.Nm recallocarray 3764c3fdb4Szrj.Nd memory reallocation functions 3866932323SSascha Wildner.Sh LIBRARY 3966932323SSascha Wildner.Lb libc 4066932323SSascha Wildner.Sh SYNOPSIS 4166932323SSascha Wildner.In stdlib.h 4266932323SSascha Wildner.Ft void * 4366932323SSascha Wildner.Fn reallocarray "void *ptr" "size_t number" "size_t size" 4464c3fdb4Szrj.Ft void * 4564c3fdb4Szrj.Fn recallocarray "void *ptr" "size_t oldnmemb" "size_t nmemb" "size_t size" 4666932323SSascha Wildner.Sh DESCRIPTION 4766932323SSascha WildnerThe 4866932323SSascha Wildner.Fn reallocarray 4966932323SSascha Wildnerfunction is similar to the 5066932323SSascha Wildner.Fn realloc 5164c3fdb4Szrjfunction except it operates on 5266932323SSascha Wildner.Fa number 5366932323SSascha Wildnermembers of size 5466932323SSascha Wildner.Fa size 5566932323SSascha Wildnerand checks for integer overflow in the calculation 5666932323SSascha Wildner.Fa number 5766932323SSascha Wildner* 5866932323SSascha Wildner.Fa size . 5964c3fdb4Szrj.Pp 6064c3fdb4SzrjThe 6164c3fdb4Szrj.Fn recallocarray 6264c3fdb4Szrjfunction is similar to 6364c3fdb4Szrj.Fn reallocarray 6464c3fdb4Szrjexcept it ensures newly allocated memory is cleared similar to 6564c3fdb4Szrj.Fn calloc . 6666932323SSascha Wildner.Sh RETURN VALUES 6766932323SSascha WildnerThe 6866932323SSascha Wildner.Fn reallocarray 6966932323SSascha Wildnerfunction returns a pointer to the allocated space; otherwise, a 7066932323SSascha Wildner.Dv NULL 7166932323SSascha Wildnerpointer is returned and 7266932323SSascha Wildner.Va errno 7366932323SSascha Wildneris set to 7466932323SSascha Wildner.Er ENOMEM . 7566932323SSascha Wildner.Sh EXAMPLES 7666932323SSascha WildnerConsider 7766932323SSascha Wildner.Fn reallocarray 7866932323SSascha Wildnerwhen there is multiplication in the 7966932323SSascha Wildner.Fa size 8066932323SSascha Wildnerargument of 8166932323SSascha Wildner.Fn malloc 8266932323SSascha Wildneror 8366932323SSascha Wildner.Fn realloc . 8466932323SSascha WildnerFor example, avoid this common idiom as it may lead to integer overflow: 8566932323SSascha Wildner.Bd -literal -offset indent 8666932323SSascha Wildnerif ((p = malloc(num * size)) == NULL) 8766932323SSascha Wildner err(1, "malloc"); 8866932323SSascha Wildner.Ed 8966932323SSascha Wildner.Pp 9066932323SSascha WildnerA drop-in replacement is the 9166932323SSascha Wildner.Ox 9266932323SSascha Wildnerextension 9366932323SSascha Wildner.Fn reallocarray : 9466932323SSascha Wildner.Bd -literal -offset indent 9566932323SSascha Wildnerif ((p = reallocarray(NULL, num, size)) == NULL) 9666932323SSascha Wildner err(1, "reallocarray"); 9766932323SSascha Wildner.Ed 9866932323SSascha Wildner.Pp 9966932323SSascha WildnerWhen using 10066932323SSascha Wildner.Fn realloc , 10166932323SSascha Wildnerbe careful to avoid the following idiom: 10266932323SSascha Wildner.Bd -literal -offset indent 10366932323SSascha Wildnersize += 50; 10466932323SSascha Wildnerif ((p = realloc(p, size)) == NULL) 10566932323SSascha Wildner return (NULL); 10666932323SSascha Wildner.Ed 10766932323SSascha Wildner.Pp 10866932323SSascha WildnerDo not adjust the variable describing how much memory has been allocated 10966932323SSascha Wildneruntil the allocation has been successful. 11066932323SSascha WildnerThis can cause aberrant program behavior if the incorrect size value is used. 11166932323SSascha WildnerIn most cases, the above sample will also result in a leak of memory. 11266932323SSascha WildnerAs stated earlier, a return value of 11366932323SSascha Wildner.Dv NULL 11466932323SSascha Wildnerindicates that the old object still remains allocated. 11566932323SSascha WildnerBetter code looks like this: 11666932323SSascha Wildner.Bd -literal -offset indent 11766932323SSascha Wildnernewsize = size + 50; 11866932323SSascha Wildnerif ((newp = realloc(p, newsize)) == NULL) { 11966932323SSascha Wildner free(p); 12066932323SSascha Wildner p = NULL; 12166932323SSascha Wildner size = 0; 12266932323SSascha Wildner return (NULL); 12366932323SSascha Wildner} 12466932323SSascha Wildnerp = newp; 12566932323SSascha Wildnersize = newsize; 12666932323SSascha Wildner.Ed 12766932323SSascha Wildner.Pp 12866932323SSascha WildnerAs with 12966932323SSascha Wildner.Fn malloc , 13066932323SSascha Wildnerit is important to ensure the new size value will not overflow; 13166932323SSascha Wildneri.e. avoid allocations like the following: 13266932323SSascha Wildner.Bd -literal -offset indent 13366932323SSascha Wildnerif ((newp = realloc(p, num * size)) == NULL) { 13466932323SSascha Wildner ... 13566932323SSascha Wildner.Ed 13666932323SSascha Wildner.Pp 13766932323SSascha WildnerInstead, use 13866932323SSascha Wildner.Fn reallocarray : 13966932323SSascha Wildner.Bd -literal -offset indent 14066932323SSascha Wildnerif ((newp = reallocarray(p, num, size)) == NULL) { 14166932323SSascha Wildner ... 14266932323SSascha Wildner.Ed 14366932323SSascha Wildner.Sh SEE ALSO 14466932323SSascha Wildner.Xr realloc 3 14566932323SSascha Wildner.Sh HISTORY 14666932323SSascha WildnerThe 14766932323SSascha Wildner.Fn reallocarray 14866932323SSascha Wildnerfunction first appeared in 149*d79aa16aSSascha Wildner.Ox 5.6 150*d79aa16aSSascha Wildnerand 151*d79aa16aSSascha Wildner.Dx 5.5 . 15264c3fdb4Szrj.Pp 15364c3fdb4SzrjThe 15464c3fdb4Szrj.Fn recallocarray 15564c3fdb4Szrjfunction appeared in 15664c3fdb4Szrj.Ox 6.1 15766932323SSascha Wildnerand 158*d79aa16aSSascha Wildner.Dx 5.5 . 159