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