On 1 May 2015 at 21:32, Baptiste Daroussin <b...@freebsd.org> wrote: > Author: bapt > Date: Fri May 1 18:32:16 2015 > New Revision: 282314 > URL: https://svnweb.freebsd.org/changeset/base/282314 > > Log: > Import reallocarray(3) from OpenBSD > > Add a manpage for it, assign the copyright to the OpenBSD project on it > since it > is mostly copy/paste from OpenBSD manpage. > style(9) fixes >[..]
> Added: head/lib/libc/stdlib/reallocarray.3 > ============================================================================== > --- /dev/null 00:00:00 1970 (empty, because file is newly added) > +++ head/lib/libc/stdlib/reallocarray.3 Fri May 1 18:32:16 2015 > (r282314) > @@ -0,0 +1,136 @@ > +.\" Copyright (c) 2015 OpenBSD > +.\" All rights reserved. This copyright notice looks suspicious. > +.\" > +.\" This code is derived from software contributed to Berkeley by > +.\" the American National Standards Committee X3, on Information > +.\" Processing Systems. > +.\" > +.\" 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 REGENTS 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 REGENTS 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. > +.\" > +.\" $FreeBSD$ > +.\" > +.Dd May 1, 2015 > +.Dt REALLOCARRAY 3 > +.Os > +.Sh NAME > +.Nm reallocarray > +.Nd memory reallocation function > +.Sh LIBRARY > +.Lb libc > +.Sh SYNOPSIS > +.In stdlib.h > +.Ft void * > +.Fn reallocarray "void *ptr" "size_t nmemb" "size_t size" > +.Sh DESCRIPTION > +The > +.Fn reallocarray > +except it operates on This is not parseable. > +.Fa nmemb > +members of size > +.Fa size > +and checks for integer overflow in the calculation > +.Fa nmemb > +* > +.Fa size . > +.Sh RETURN VALUES > +.Fn reallocarray > +return a pointer to the allocated space; otherwise, a > +.Dv NULL > +pointer is returned and > +.Va errno > +is set to > +.Er ENOMEM . > +.Sh EXAMPLES > +Consider > +.Fn reallocarray > +when there is multiplication in the > +.Fa size > +argument of > +.Fn malloc > +or > +.Fn realloc . > +For example, avoid this common idiom as it may lead to integer overflow: > +.Bd -literal -offset indent > +if ((p = malloc(num * size)) == NULL) > + err(1, "malloc"); > +.Ed > +.Pp > +A drop-in replacement is the > +.Ox > +extension > +.Fn reallocarray : > +.Bd -literal -offset indent > +if ((p = reallocarray(NULL, num, size)) == NULL) > + err(1, "reallocarray"); > +.Ed > +.Pp > +When using > +.Fn realloc , > +be careful to avoid the following idiom: > +.Bd -literal -offset indent > +size += 50; > +if ((p = realloc(p, size)) == NULL) > + return (NULL); > +.Ed > +.Pp > +Do not adjust the variable describing how much memory has been allocated > +until the allocation has been successful. > +This can cause aberrant program behavior if the incorrect size value is used. > +In most cases, the above sample will also result in a leak of memory. > +As stated earlier, a return value of > +.Dv NULL > +indicates that the old object still remains allocated. > +Better code looks like this: > +.Bd -literal -offset indent > +newsize = size + 50; > +if ((newp = realloc(p, newsize)) == NULL) { > + free(p); > + p = NULL; > + size = 0; > + return (NULL); > +} > +p = newp; > +size = newsize; > +.Ed > +.Pp > +As with > +.Fn malloc , > +it is important to ensure the new size value will not overflow; > +i.e. avoid allocations like the following: > +.Bd -literal -offset indent > +if ((newp = realloc(p, num * size)) == NULL) { > + ... > +.Ed > +.Pp > +Instead, use > +.Fn reallocarray : > +.Bd -literal -offset indent > +if ((newp = reallocarray(p, num, size)) == NULL) { > + ... > +.Ed > +.Sh SEE ALSO > +.Xr realloc 3 > +.Sh HISTORY > +The > +.Fn reallocf > +function first appeared in > +.Ox 5.6 . This looks unrelative and untrue. -- wbr, pluknet _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"