xref: /openbsd-src/lib/libc/stdlib/malloc.3 (revision 7350f337b9e3eb4461d99580e625c7ef148d107c)
1.\"
2.\" Copyright (c) 1980, 1991, 1993
3.\"	The Regents of the University of California.  All rights reserved.
4.\"
5.\" This code is derived from software contributed to Berkeley by
6.\" the American National Standards Committee X3, on Information
7.\" Processing Systems.
8.\"
9.\" Redistribution and use in source and binary forms, with or without
10.\" modification, are permitted provided that the following conditions
11.\" are met:
12.\" 1. Redistributions of source code must retain the above copyright
13.\"    notice, this list of conditions and the following disclaimer.
14.\" 2. Redistributions in binary form must reproduce the above copyright
15.\"    notice, this list of conditions and the following disclaimer in the
16.\"    documentation and/or other materials provided with the distribution.
17.\" 3. Neither the name of the University nor the names of its contributors
18.\"    may be used to endorse or promote products derived from this software
19.\"    without specific prior written permission.
20.\"
21.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31.\" SUCH DAMAGE.
32.\"
33.\"	$OpenBSD: malloc.3,v 1.125 2019/05/19 15:30:21 schwarze Exp $
34.\"
35.Dd $Mdocdate: May 19 2019 $
36.Dt MALLOC 3
37.Os
38.Sh NAME
39.Nm malloc ,
40.Nm calloc ,
41.Nm realloc ,
42.Nm free ,
43.Nm reallocarray ,
44.Nm recallocarray ,
45.Nm freezero ,
46.Nm aligned_alloc ,
47.Nm malloc_conceal ,
48.Nm calloc_conceal
49.Nd memory allocation and deallocation
50.Sh SYNOPSIS
51.In stdlib.h
52.Ft void *
53.Fn malloc "size_t size"
54.Ft void *
55.Fn calloc "size_t nmemb" "size_t size"
56.Ft void *
57.Fn realloc "void *ptr" "size_t size"
58.Ft void
59.Fn free "void *ptr"
60.Ft void *
61.Fn reallocarray "void *ptr" "size_t nmemb" "size_t size"
62.Ft void *
63.Fn recallocarray "void *ptr" "size_t oldnmemb" "size_t nmemb" "size_t size"
64.Ft void
65.Fn freezero "void *ptr" "size_t size"
66.Ft void *
67.Fn aligned_alloc "size_t alignment" "size_t size"
68.Ft void *
69.Fn malloc_conceal "size_t size"
70.Ft void *
71.Fn calloc_conceal "size_t nmemb" "size_t size"
72.Vt char *malloc_options ;
73.Sh DESCRIPTION
74The standard functions
75.Fn malloc ,
76.Fn calloc ,
77and
78.Fn realloc
79allocate
80.Em objects ,
81regions of memory to store values.
82The
83.Fn malloc
84function allocates uninitialized space for an object of
85the specified
86.Fa size .
87.Fn malloc
88maintains multiple lists of free objects according to size, allocating
89from the appropriate list or requesting memory from the kernel.
90The allocated space is suitably aligned (after possible pointer coercion) for
91storage of any type of object.
92.Pp
93The
94.Fn calloc
95function allocates space for an array of
96.Fa nmemb
97objects, each of the specified
98.Fa size .
99The space is initialized to zero.
100.Pp
101The
102.Fn realloc
103function changes the size of the object pointed to by
104.Fa ptr
105to
106.Fa size
107bytes and returns a pointer to the (possibly moved) object.
108If
109.Fa ptr
110is not
111.Dv NULL ,
112it must be a pointer returned by an earlier call to an allocation or
113reallocation function that was not freed in between.
114The contents of the object are unchanged up to the lesser
115of the new and old sizes.
116If the new size is larger, the value of the newly allocated portion
117of the object is indeterminate and uninitialized.
118If the space cannot be allocated, the object
119pointed to by
120.Fa ptr
121is unchanged.
122If
123.Fa ptr
124is
125.Dv NULL ,
126.Fn realloc
127behaves like
128.Fn malloc
129and allocates a new object.
130.Pp
131The
132.Fn free
133function causes the space pointed to by
134.Fa ptr
135to be either placed on a list of free blocks to make it available for future
136allocation or, when appropriate, to be returned to the kernel using
137.Xr munmap 2 .
138If
139.Fa ptr
140is
141.Dv NULL ,
142no action occurs.
143If
144.Fa ptr
145was previously freed by
146.Fn free
147or a reallocation function,
148the behavior is undefined and the double free is a security concern.
149.Pp
150Designed for safe allocation of arrays,
151the
152.Fn reallocarray
153function is similar to
154.Fn realloc
155except it operates on
156.Fa nmemb
157members of size
158.Fa size
159and checks for integer overflow in the calculation
160.Fa nmemb
161*
162.Fa size .
163.Pp
164Used for the allocation of memory holding sensitive data,
165the
166.Fn recallocarray
167and
168.Fn freezero
169functions guarantee that memory becoming unallocated is explicitly
170.Em discarded ,
171meaning pages of memory are disposed via
172.Xr munmap 2
173and cached free objects are cleared with
174.Xr explicit_bzero 3 .
175.Pp
176The
177.Fn recallocarray
178function is similar to
179.Fn reallocarray
180except it ensures newly allocated memory is cleared similar to
181.Fn calloc .
182If
183.Fa ptr
184is
185.Dv NULL ,
186.Fa oldnmemb
187is ignored and the call is equivalent to
188.Fn calloc .
189If
190.Fa ptr
191is not
192.Dv NULL ,
193.Fa oldnmemb
194must be a value such that
195.Fa oldnmemb
196*
197.Fa size
198is the size of the earlier allocation that returned
199.Fa ptr ,
200otherwise the behavior is undefined.
201.Pp
202The
203.Fn freezero
204function is similar to the
205.Fn free
206function except it ensures memory is explicitly discarded.
207If
208.Fa ptr
209is
210.Dv NULL ,
211no action occurs.
212If
213.Fa ptr
214is not
215.Dv NULL ,
216the
217.Fa size
218argument must be equal to or smaller than the size of the earlier allocation
219that returned
220.Fa ptr .
221.Fn freezero
222guarantees the memory range starting at
223.Fa ptr
224with length
225.Fa size
226is discarded while deallocating the whole object originally allocated.
227.Pp
228The
229.Fn aligned_alloc
230function allocates
231.Fa size
232bytes of memory such that the allocation's base address is a multiple of
233.Fa alignment .
234The requested
235.Fa alignment
236must be a power of 2.
237If
238.Fa size
239is not a multiple of
240.Fa alignment ,
241behavior is undefined.
242.Pp
243The
244.Fn malloc_conceal
245and
246.Fn calloc_conceal
247functions behave the same as
248.Fn malloc
249and
250.Fn calloc
251respectively,
252with the exception that the allocation returned is marked with the
253.Dv MAP_CONCEAL
254.Xr mmap 2
255flag and calling
256.Fn free
257on the allocation will discard the contents explicitly.
258A reallocation of a concealed allocation will leave these properties intact.
259.Sh MALLOC OPTIONS
260Upon the first call to the
261.Fn malloc
262family of functions, an initialization sequence inspects the
263value of the
264.Va vm.malloc_conf
265.Xr sysctl 2 ,
266next checks the environment for a variable called
267.Ev MALLOC_OPTIONS ,
268and finally looks at the global variable
269.Va malloc_options
270in the program.
271Each is scanned for the flags documented below.
272Unless otherwise noted uppercase means on, lowercase means off.
273During initialization, flags occurring later modify the behaviour
274that was requested by flags processed earlier.
275.Bl -tag -width indent
276.It Cm C
277.Dq Canaries .
278Add canaries at the end of allocations in order to detect
279heap overflows.
280The canary's content is checked when
281.Nm free
282is called.
283If it has been corrupted, the process is aborted.
284.It Cm D
285.Dq Dump .
286.Fn malloc
287will dump statistics to the file
288.Pa ./malloc.out ,
289if it already exists,
290at exit.
291This option requires the library to have been compiled with -DMALLOC_STATS in
292order to have any effect.
293.It Cm F
294.Dq Freecheck .
295Enable more extensive double free and use after free detection.
296All chunks in the delayed free list will be checked for double frees.
297Unused pages on the freelist are read and write protected to
298cause a segmentation fault upon access.
299.It Cm G
300.Dq Guard .
301Enable guard pages.
302Each page size or larger allocation is followed by a guard page that will
303cause a segmentation fault upon any access.
304.It Cm J
305.Dq More junking .
306Increase the junk level by one if it is smaller than 2.
307.It Cm j
308.Dq Less junking .
309Decrease the junk level by one if it is larger than 0.
310Junking writes some junk bytes into the area allocated.
311Junk is bytes of 0xdb when allocating;
312freed chunks are filled with 0xdf.
313By default the junk level is 1: after free,
314small chunks are completely junked;
315for pages the first part is junked.
316After a delay,
317the filling pattern is validated and the process is aborted if the pattern
318was modified.
319For junk level 2, junking is done on allocation as well and without size
320restrictions.
321If the junk level is zero, no junking is performed.
322.It Cm R
323.Dq realloc .
324Always reallocate when
325.Fn realloc
326is called, even if the initial allocation was big enough.
327.\".Pp
328.\".It Cm U
329.\".Dq utrace .
330.\"Generate entries for
331.\".Xr ktrace 1
332.\"for all operations.
333.\"Consult the source for this one.
334.It Cm S
335Enable all options suitable for security auditing.
336.It Cm U
337.Dq Free unmap .
338Enable use after free protection for larger allocations.
339Unused pages on the freelist are read and write protected to
340cause a segmentation fault upon access.
341.It Cm X
342.Dq xmalloc .
343Rather than return failure,
344.Xr abort 3
345the program with a diagnostic message on stderr.
346It is the intention that this option be set at compile time by
347including in the source:
348.Bd -literal -offset indent
349extern char *malloc_options;
350malloc_options = "X";
351.Ed
352.Pp
353Note that this will cause code that is supposed to handle
354out-of-memory conditions gracefully to abort instead.
355.It Cm <
356.Dq Halve the cache size .
357Decrease the size of the free page cache by a factor of two.
358.It Cm >
359.Dq Double the cache size .
360Increase the size of the free page cache by a factor of two.
361.El
362.Pp
363If a program changes behavior if any of these options (except
364.Cm X )
365are used,
366it is buggy.
367.Pp
368The default number of free pages cached is 64 per malloc pool.
369Multi-threaded programs use multiple pools.
370.Sh RETURN VALUES
371Upon successful completion, the allocation functions
372return a pointer to the allocated space; otherwise,
373.Dv NULL
374is returned and
375.Va errno
376is set to
377.Er ENOMEM .
378The function
379.Fn aligned_alloc
380returns
381.Dv NULL
382and sets
383.Va errno
384to
385.Er EINVAL
386if
387.Fa alignment
388is not a power of 2.
389.Pp
390If
391.Fa nmemb
392or
393.Fa size
394is equal to 0, a unique pointer to an access protected,
395zero sized object is returned.
396Access via this pointer will generate a
397.Dv SIGSEGV
398exception.
399.Pp
400If multiplying
401.Fa nmemb
402and
403.Fa size
404results in integer overflow,
405.Fn calloc ,
406.Fn reallocarray
407and
408.Fn recallocarray
409return
410.Dv NULL
411and set
412.Va errno
413to
414.Er ENOMEM .
415.Pp
416If
417.Fa ptr
418is not
419.Dv NULL
420and multiplying
421.Fa oldnmemb
422and
423.Fa size
424results in integer overflow
425.Fn recallocarray
426returns
427.Dv NULL
428and sets
429.Va errno
430to
431.Er EINVAL .
432.Sh IDIOMS
433Consider
434.Fn calloc
435or the extensions
436.Fn reallocarray
437and
438.Fn recallocarray
439when there is multiplication in the
440.Fa size
441argument of
442.Fn malloc
443or
444.Fn realloc .
445For example, avoid this common idiom as it may lead to integer overflow:
446.Bd -literal -offset indent
447if ((p = malloc(num * size)) == NULL)
448	err(1, NULL);
449.Ed
450.Pp
451A drop-in replacement is the
452.Ox
453extension
454.Fn reallocarray :
455.Bd -literal -offset indent
456if ((p = reallocarray(NULL, num, size)) == NULL)
457	err(1, NULL);
458.Ed
459.Pp
460Alternatively,
461.Fn calloc
462may be used at the cost of initialization overhead.
463.Pp
464When using
465.Fn realloc ,
466be careful to avoid the following idiom:
467.Bd -literal -offset indent
468size += 50;
469if ((p = realloc(p, size)) == NULL)
470	return (NULL);
471.Ed
472.Pp
473Do not adjust the variable describing how much memory has been allocated
474until the allocation has been successful.
475This can cause aberrant program behavior if the incorrect size value is used.
476In most cases, the above sample will also result in a leak of memory.
477As stated earlier, a return value of
478.Dv NULL
479indicates that the old object still remains allocated.
480Better code looks like this:
481.Bd -literal -offset indent
482newsize = size + 50;
483if ((newp = realloc(p, newsize)) == NULL) {
484	free(p);
485	p = NULL;
486	size = 0;
487	return (NULL);
488}
489p = newp;
490size = newsize;
491.Ed
492.Pp
493As with
494.Fn malloc ,
495it is important to ensure the new size value will not overflow;
496i.e. avoid allocations like the following:
497.Bd -literal -offset indent
498if ((newp = realloc(p, num * size)) == NULL) {
499	...
500.Ed
501.Pp
502Instead, use
503.Fn reallocarray :
504.Bd -literal -offset indent
505if ((newp = reallocarray(p, num, size)) == NULL) {
506	...
507.Ed
508.Pp
509Calling
510.Fn realloc
511with a
512.Dv NULL
513.Fa ptr
514is equivalent to calling
515.Fn malloc .
516Instead of this idiom:
517.Bd -literal -offset indent
518if (p == NULL)
519	newp = malloc(newsize);
520else
521	newp = realloc(p, newsize);
522.Ed
523.Pp
524Use the following:
525.Bd -literal -offset indent
526newp = realloc(p, newsize);
527.Ed
528.Pp
529The
530.Fn recallocarray
531function should be used for resizing objects containing sensitive data like
532keys.
533To avoid leaking information,
534it guarantees memory is cleared before placing it on the internal free list.
535Deallocation of such an object should be done by calling
536.Fn freezero .
537.Sh ENVIRONMENT
538.Bl -tag -width "MALLOC_OPTIONS"
539.It Ev MALLOC_OPTIONS
540String of option flags.
541.El
542.Sh EXAMPLES
543If
544.Fn malloc
545must be used with multiplication, be sure to test for overflow:
546.Bd -literal -offset indent
547size_t num, size;
548\&...
549
550/* Check for size_t overflow */
551if (size && num > SIZE_MAX / size)
552	errc(1, EOVERFLOW, "overflow");
553
554if ((p = malloc(num * size)) == NULL)
555	err(1, NULL);
556.Ed
557.Pp
558The above test is not sufficient in all cases.
559For example, multiplying ints requires a different set of checks:
560.Bd -literal -offset indent
561int num, size;
562\&...
563
564/* Avoid invalid requests */
565if (size < 0 || num < 0)
566	errc(1, EOVERFLOW, "overflow");
567
568/* Check for signed int overflow */
569if (size && num > INT_MAX / size)
570	errc(1, EOVERFLOW, "overflow");
571
572if ((p = malloc(num * size)) == NULL)
573	err(1, NULL);
574.Ed
575.Pp
576Assuming the implementation checks for integer overflow as
577.Ox
578does, it is much easier to use
579.Fn calloc ,
580.Fn reallocarray ,
581or
582.Fn recallocarray .
583.Pp
584The above examples could be simplified to:
585.Bd -literal -offset indent
586if ((p = reallocarray(NULL, num, size)) == NULL)
587	err(1, NULL);
588.Ed
589.Pp
590or at the cost of initialization:
591.Bd -literal -offset indent
592if ((p = calloc(num, size)) == NULL)
593	err(1, NULL);
594.Ed
595.Pp
596Set a systemwide reduction of the cache to a quarter of the
597default size and use guard pages:
598.Pp
599.Dl # sysctl vm.malloc_conf='G<<'
600.Sh DIAGNOSTICS
601If any of the functions detect an error condition,
602a message will be printed to file descriptor
6032 (not using stdio).
604Errors will result in the process being aborted.
605.Pp
606Here is a brief description of the error messages and what they mean:
607.Bl -tag -width Ds
608.It Dq out of memory
609If the
610.Cm X
611option is specified it is an error for the allocation functions
612to return
613.Dv NULL .
614.It Dq bogus pointer (double free?)
615An attempt to
616.Fn free
617or
618reallocate an unallocated pointer was made.
619.It Dq chunk is already free
620There was an attempt to free a chunk that had already been freed.
621.It Dq use after free
622A chunk has been modified after it was freed.
623.It Dq modified chunk-pointer
624The pointer passed to
625.Fn free
626or a reallocation function has been modified.
627.It Dq chunk canary corrupted address offset@length
628A byte after the requested size has been overwritten,
629indicating a heap overflow.
630The offset at which corruption was detected is printed before the @,
631and the requested length of the allocation after the @.
632.It Dq recorded old size oldsize != size
633.Fn recallocarray
634has detected that the given old size does not equal the recorded size in its
635meta data.
636Enabling option
637.Cm C
638allows
639.Fn recallocarray
640to catch more of these cases.
641.It Dq recursive call
642An attempt was made to call recursively into these functions, i.e., from a
643signal handler.
644This behavior is not supported.
645In particular, signal handlers should
646.Em not
647use any of the
648.Fn malloc
649functions nor utilize any other functions which may call
650.Fn malloc
651(e.g.,
652.Xr stdio 3
653routines).
654.It Dq unknown char in MALLOC_OPTIONS
655We found something we didn't understand.
656.It any other error
657.Fn malloc
658detected an internal error;
659consult sources and/or wizards.
660.El
661.Sh SEE ALSO
662.Xr brk 2 ,
663.Xr mmap 2 ,
664.Xr munmap 2 ,
665.Xr sysctl 2 ,
666.Xr alloca 3 ,
667.Xr getpagesize 3 ,
668.Xr posix_memalign 3
669.Sh STANDARDS
670The
671.Fn malloc ,
672.Fn calloc ,
673.Fn realloc ,
674and
675.Fn free
676functions conform to
677.St -ansiC .
678The
679.Fn aligned_alloc
680function conforms to
681.St -isoC-2011 .
682.Pp
683If
684.Fa nmemb
685or
686.Fa size
687are 0, the return value is implementation defined;
688other conforming implementations may return
689.Dv NULL
690in this case.
691.Pp
692The
693.Ev MALLOC_OPTIONS
694environment variable, the
695.Va vm.malloc_conf
696sysctl and the
697.Sx DIAGNOSTICS
698output are extensions to the standard.
699.Sh HISTORY
700A
701.Fn free
702internal kernel function and a predecessor to
703.Fn malloc ,
704.Fn alloc ,
705first appeared in
706.At v1 .
707C library functions
708.Fn alloc
709and
710.Fn free
711appeared in
712.At v6 .
713The functions
714.Fn malloc ,
715.Fn calloc ,
716and
717.Fn realloc
718first appeared in
719.At v7 .
720.Pp
721A new implementation by Chris Kingsley was introduced in
722.Bx 4.2 ,
723followed by a complete rewrite by Poul-Henning Kamp which appeared in
724.Fx 2.2
725and was included in
726.Ox 2.0 .
727These implementations were all
728.Xr sbrk 2
729based.
730In
731.Ox 3.8 ,
732Thierry Deval rewrote
733.Nm
734to use the
735.Xr mmap 2
736system call,
737making the page addresses returned by
738.Nm
739random.
740A rewrite by Otto Moerbeek introducing a new central data structure and more
741randomization appeared in
742.Ox 4.4 .
743.Pp
744The
745.Fn reallocarray
746function appeared in
747.Ox 5.6 .
748The
749.Fn recallocarray
750function appeared in
751.Ox 6.1 .
752The
753.Fn freezero
754function appeared in
755.Ox 6.2 .
756The
757.Fn aligned_alloc
758function appeared in
759.Ox 6.5 .
760The
761.Fn malloc_conceal
762and
763.Fn calloc_conceal
764functions appeared in
765.Ox 6.6 .
766.Sh CAVEATS
767When using
768.Fn malloc ,
769be wary of signed integer and
770.Vt size_t
771overflow especially when there is multiplication in the
772.Fa size
773argument.
774.Pp
775Signed integer overflow will cause undefined behavior which compilers
776typically handle by wrapping back around to negative numbers.
777Depending on the input, this can result in allocating more or less
778memory than intended.
779.Pp
780An unsigned overflow has defined behavior which will wrap back around and
781return less memory than intended.
782.Pp
783A signed or unsigned integer overflow is a
784.Em security
785risk if less memory is returned than intended.
786Subsequent code may corrupt the heap by writing beyond the memory that was
787allocated.
788An attacker may be able to leverage this heap corruption to execute arbitrary
789code.
790.Pp
791Consider using
792.Fn calloc ,
793.Fn reallocarray
794or
795.Fn recallocarray
796instead of using multiplication in
797.Fn malloc
798and
799.Fn realloc
800to avoid these problems on
801.Ox .
802