xref: /openbsd-src/lib/libc/stdlib/malloc.3 (revision 172e4b14195019a7bc72f63f2a62581d7903b8ec)
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.130 2023/04/01 18:47:51 otto Exp $
34.\"
35.Dd $Mdocdate: April 1 2023 $
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 and
297write after frees.
298Unused pages on the freelist are read and write protected to
299cause a segmentation fault upon access.
300.It Cm G
301.Dq Guard .
302Enable guard pages.
303Each page size or larger allocation is followed by a guard page that will
304cause a segmentation fault upon any access.
305.It Cm J
306.Dq More junking .
307Increase the junk level by one if it is smaller than 2.
308.It Cm j
309.Dq Less junking .
310Decrease the junk level by one if it is larger than 0.
311Junking writes some junk bytes into the area allocated.
312Junk is bytes of 0xdb when allocating;
313freed chunks are filled with 0xdf.
314By default the junk level is 1: after free,
315small chunks are completely junked;
316for pages the first part is junked.
317After a delay,
318the filling pattern is validated and the process is aborted if the pattern
319was modified.
320For junk level 2, junking is done on allocation as well and without size
321restrictions.
322If the junk level is zero, no junking is performed.
323.It Cm R
324.Dq realloc .
325Always reallocate when
326.Fn realloc
327is called, even if the initial allocation was big enough.
328.\".Pp
329.\".It Cm U
330.\".Dq utrace .
331.\"Generate entries for
332.\".Xr ktrace 1
333.\"for all operations.
334.\"Consult the source for this one.
335.It Cm S
336.\" Malloc option S is vaguely documented on purpose.
337Enable all options suitable for security auditing.
338.It Cm U
339.Dq Free unmap .
340Enable use after free protection for larger allocations.
341Unused pages on the freelist are read and write protected to
342cause a segmentation fault upon access.
343.It Cm X
344.Dq xmalloc .
345Rather than return failure,
346.Xr abort 3
347the program with a diagnostic message on stderr.
348It is the intention that this option be set at compile time by
349including in the source:
350.Bd -literal -offset indent
351extern char *malloc_options;
352malloc_options = "X";
353.Ed
354.Pp
355Note that this will cause code that is supposed to handle
356out-of-memory conditions gracefully to abort instead.
357.It Cm <
358.Dq Halve the cache size .
359Decrease the size of the free page cache by a factor of two.
360.It Cm >
361.Dq Double the cache size .
362Increase the size of the free page cache by a factor of two.
363.El
364.Pp
365If a program changes behavior if any of these options (except
366.Cm X )
367are used,
368it is buggy.
369.Pp
370The default size of the cache is 64 single page allocations.
371It also caches a number of larger regions.
372Multi-threaded programs use multiple pools.
373.Sh RETURN VALUES
374Upon successful completion, the allocation functions
375return a pointer to the allocated space; otherwise,
376.Dv NULL
377is returned and
378.Va errno
379is set to
380.Er ENOMEM .
381The function
382.Fn aligned_alloc
383returns
384.Dv NULL
385and sets
386.Va errno
387to
388.Er EINVAL
389if
390.Fa alignment
391is not a power of 2.
392.Pp
393If
394.Fa nmemb
395or
396.Fa size
397is equal to 0, a unique pointer to an access protected,
398zero sized object is returned.
399Access via this pointer will generate a
400.Dv SIGSEGV
401exception.
402.Pp
403If multiplying
404.Fa nmemb
405and
406.Fa size
407results in integer overflow,
408.Fn calloc ,
409.Fn reallocarray
410and
411.Fn recallocarray
412return
413.Dv NULL
414and set
415.Va errno
416to
417.Er ENOMEM .
418.Pp
419If
420.Fa ptr
421is not
422.Dv NULL
423and multiplying
424.Fa oldnmemb
425and
426.Fa size
427results in integer overflow,
428.Fn recallocarray
429returns
430.Dv NULL
431and sets
432.Va errno
433to
434.Er EINVAL .
435.Sh IDIOMS
436Consider
437.Fn calloc
438or the extensions
439.Fn reallocarray
440and
441.Fn recallocarray
442when there is multiplication in the
443.Fa size
444argument of
445.Fn malloc
446or
447.Fn realloc .
448For example, avoid this common idiom as it may lead to integer overflow:
449.Bd -literal -offset indent
450if ((p = malloc(num * size)) == NULL)
451	err(1, NULL);
452.Ed
453.Pp
454A drop-in replacement is the
455.Ox
456extension
457.Fn reallocarray :
458.Bd -literal -offset indent
459if ((p = reallocarray(NULL, num, size)) == NULL)
460	err(1, NULL);
461.Ed
462.Pp
463Alternatively,
464.Fn calloc
465may be used at the cost of initialization overhead.
466.Pp
467When using
468.Fn realloc ,
469be careful to avoid the following idiom:
470.Bd -literal -offset indent
471size += 50;
472if ((p = realloc(p, size)) == NULL)
473	return (NULL);
474.Ed
475.Pp
476Do not adjust the variable describing how much memory has been allocated
477until the allocation has been successful.
478This can cause aberrant program behavior if the incorrect size value is used.
479In most cases, the above sample will also result in a leak of memory.
480As stated earlier, a return value of
481.Dv NULL
482indicates that the old object still remains allocated.
483Better code looks like this:
484.Bd -literal -offset indent
485newsize = size + 50;
486if ((newp = realloc(p, newsize)) == NULL) {
487	free(p);
488	p = NULL;
489	size = 0;
490	return (NULL);
491}
492p = newp;
493size = newsize;
494.Ed
495.Pp
496As with
497.Fn malloc ,
498it is important to ensure the new size value will not overflow;
499i.e. avoid allocations like the following:
500.Bd -literal -offset indent
501if ((newp = realloc(p, num * size)) == NULL) {
502	...
503.Ed
504.Pp
505Instead, use
506.Fn reallocarray :
507.Bd -literal -offset indent
508if ((newp = reallocarray(p, num, size)) == NULL) {
509	...
510.Ed
511.Pp
512Calling
513.Fn realloc
514with a
515.Dv NULL
516.Fa ptr
517is equivalent to calling
518.Fn malloc .
519Instead of this idiom:
520.Bd -literal -offset indent
521if (p == NULL)
522	newp = malloc(newsize);
523else
524	newp = realloc(p, newsize);
525.Ed
526.Pp
527Use the following:
528.Bd -literal -offset indent
529newp = realloc(p, newsize);
530.Ed
531.Pp
532The
533.Fn recallocarray
534function should be used for resizing objects containing sensitive data like
535keys.
536To avoid leaking information,
537it guarantees memory is cleared before placing it on the internal free list.
538Deallocation of such an object should be done by calling
539.Fn freezero .
540.Sh ENVIRONMENT
541.Bl -tag -width "MALLOC_OPTIONS"
542.It Ev MALLOC_OPTIONS
543String of option flags.
544.El
545.Sh EXAMPLES
546If
547.Fn malloc
548must be used with multiplication, be sure to test for overflow:
549.Bd -literal -offset indent
550size_t num, size;
551\&...
552
553/* Check for size_t overflow */
554if (size && num > SIZE_MAX / size)
555	errc(1, EOVERFLOW, "overflow");
556
557if ((p = malloc(num * size)) == NULL)
558	err(1, NULL);
559.Ed
560.Pp
561The above test is not sufficient in all cases.
562For example, multiplying ints requires a different set of checks:
563.Bd -literal -offset indent
564int num, size;
565\&...
566
567/* Avoid invalid requests */
568if (size < 0 || num < 0)
569	errc(1, EOVERFLOW, "overflow");
570
571/* Check for signed int overflow */
572if (size && num > INT_MAX / size)
573	errc(1, EOVERFLOW, "overflow");
574
575if ((p = malloc(num * size)) == NULL)
576	err(1, NULL);
577.Ed
578.Pp
579Assuming the implementation checks for integer overflow as
580.Ox
581does, it is much easier to use
582.Fn calloc ,
583.Fn reallocarray ,
584or
585.Fn recallocarray .
586.Pp
587The above examples could be simplified to:
588.Bd -literal -offset indent
589if ((p = reallocarray(NULL, num, size)) == NULL)
590	err(1, NULL);
591.Ed
592.Pp
593or at the cost of initialization:
594.Bd -literal -offset indent
595if ((p = calloc(num, size)) == NULL)
596	err(1, NULL);
597.Ed
598.Pp
599Set a systemwide reduction of the cache to a quarter of the
600default size and use guard pages:
601.Pp
602.Dl # sysctl vm.malloc_conf='G<<'
603.Sh DIAGNOSTICS
604If any of the functions detect an error condition,
605a message will be printed to file descriptor
6062 (not using stdio).
607Errors will result in the process being aborted.
608.Pp
609Here is a brief description of the error messages and what they mean:
610.Bl -tag -width Ds
611.It Dq out of memory
612If the
613.Cm X
614option is specified, it is an error for the allocation functions
615to return
616.Dv NULL .
617.It Dq bogus pointer (double free?)
618An attempt to
619.Fn free
620or
621reallocate an unallocated pointer was made.
622.It Dq chunk is already free
623There was an attempt to free a chunk that had already been freed.
624.It Dq write after free
625A chunk has been modified after it was freed.
626.It Dq modified chunk-pointer
627The pointer passed to
628.Fn free
629or a reallocation function has been modified.
630.It Dq chunk canary corrupted address offset@length
631A byte after the requested size has been overwritten,
632indicating a heap overflow.
633The offset at which corruption was detected is printed before the @,
634and the requested length of the allocation after the @.
635.It Dq recorded old size oldsize != size
636.Fn recallocarray
637has detected that the given old size does not equal the recorded size in its
638meta data.
639Enabling option
640.Cm C
641allows
642.Fn recallocarray
643to catch more of these cases.
644.It Dq recursive call
645An attempt was made to call recursively into these functions, i.e., from a
646signal handler.
647This behavior is not supported.
648In particular, signal handlers should
649.Em not
650use any of the
651.Fn malloc
652functions nor utilize any other functions which may call
653.Fn malloc
654(e.g.,
655.Xr stdio 3
656routines).
657.It Dq unknown char in MALLOC_OPTIONS
658We found something we didn't understand.
659.It any other error
660.Fn malloc
661detected an internal error;
662consult sources and/or wizards.
663.El
664.Sh SEE ALSO
665.Xr brk 2 ,
666.Xr mmap 2 ,
667.Xr munmap 2 ,
668.Xr sysctl 2 ,
669.Xr alloca 3 ,
670.Xr getpagesize 3 ,
671.Xr posix_memalign 3
672.Sh STANDARDS
673The
674.Fn malloc ,
675.Fn calloc ,
676.Fn realloc ,
677and
678.Fn free
679functions conform to
680.St -ansiC .
681The
682.Fn aligned_alloc
683function conforms to
684.St -isoC-2011 .
685.Pp
686If
687.Fa nmemb
688or
689.Fa size
690are 0, the return value is implementation defined;
691other conforming implementations may return
692.Dv NULL
693in this case.
694.Pp
695The
696.Ev MALLOC_OPTIONS
697environment variable, the
698.Va vm.malloc_conf
699sysctl and the
700.Sx DIAGNOSTICS
701output are extensions to the standard.
702.Sh HISTORY
703A
704.Fn free
705internal kernel function and a predecessor to
706.Fn malloc ,
707.Fn alloc ,
708first appeared in
709.At v1 .
710C library functions
711.Fn alloc
712and
713.Fn free
714appeared in
715.At v6 .
716The functions
717.Fn malloc ,
718.Fn calloc ,
719and
720.Fn realloc
721first appeared in
722.At v7 .
723.Pp
724A new implementation by Chris Kingsley was introduced in
725.Bx 4.2 ,
726followed by a complete rewrite by Poul-Henning Kamp which appeared in
727.Fx 2.2
728and was included in
729.Ox 2.0 .
730These implementations were all
731.Xr sbrk 2
732based.
733In
734.Ox 3.8 ,
735Thierry Deval rewrote
736.Nm
737to use the
738.Xr mmap 2
739system call,
740making the page addresses returned by
741.Nm
742random.
743A rewrite by Otto Moerbeek introducing a new central data structure and more
744randomization appeared in
745.Ox 4.4 .
746.Pp
747The
748.Fn reallocarray
749function appeared in
750.Ox 5.6 .
751The
752.Fn recallocarray
753function appeared in
754.Ox 6.1 .
755The
756.Fn freezero
757function appeared in
758.Ox 6.2 .
759The
760.Fn aligned_alloc
761function appeared in
762.Ox 6.5 .
763The
764.Fn malloc_conceal
765and
766.Fn calloc_conceal
767functions appeared in
768.Ox 6.6 .
769.Sh CAVEATS
770When using
771.Fn malloc ,
772be wary of signed integer and
773.Vt size_t
774overflow especially when there is multiplication in the
775.Fa size
776argument.
777.Pp
778Signed integer overflow will cause undefined behavior which compilers
779typically handle by wrapping back around to negative numbers.
780Depending on the input, this can result in allocating more or less
781memory than intended.
782.Pp
783An unsigned overflow has defined behavior which will wrap back around and
784return less memory than intended.
785.Pp
786A signed or unsigned integer overflow is a
787.Em security
788risk if less memory is returned than intended.
789Subsequent code may corrupt the heap by writing beyond the memory that was
790allocated.
791An attacker may be able to leverage this heap corruption to execute arbitrary
792code.
793.Pp
794Consider using
795.Fn calloc ,
796.Fn reallocarray
797or
798.Fn recallocarray
799instead of using multiplication in
800.Fn malloc
801and
802.Fn realloc
803to avoid these problems on
804.Ox .
805