diff options
Diffstat (limited to 'src/lib/libc/stdlib')
| -rw-r--r-- | src/lib/libc/stdlib/malloc.c | 195 |
1 files changed, 102 insertions, 93 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c index e8e55c079e..d22fb38dae 100644 --- a/src/lib/libc/stdlib/malloc.c +++ b/src/lib/libc/stdlib/malloc.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: malloc.c,v 1.181 2016/01/26 15:44:28 otto Exp $ */ | 1 | /* $OpenBSD: malloc.c,v 1.182 2016/02/25 00:38:51 deraadt Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2008, 2010, 2011 Otto Moerbeek <otto@drijf.net> | 3 | * Copyright (c) 2008, 2010, 2011 Otto Moerbeek <otto@drijf.net> |
| 4 | * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org> | 4 | * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org> |
| @@ -470,13 +470,105 @@ map(struct dir_info *d, void *hint, size_t sz, int zero_fill) | |||
| 470 | return p; | 470 | return p; |
| 471 | } | 471 | } |
| 472 | 472 | ||
| 473 | static void | ||
| 474 | omalloc_parseopt(char opt) | ||
| 475 | { | ||
| 476 | switch (opt) { | ||
| 477 | case '>': | ||
| 478 | mopts.malloc_cache <<= 1; | ||
| 479 | if (mopts.malloc_cache > MALLOC_MAXCACHE) | ||
| 480 | mopts.malloc_cache = MALLOC_MAXCACHE; | ||
| 481 | break; | ||
| 482 | case '<': | ||
| 483 | mopts.malloc_cache >>= 1; | ||
| 484 | break; | ||
| 485 | case 'a': | ||
| 486 | case 'A': | ||
| 487 | /* ignored */ | ||
| 488 | break; | ||
| 489 | case 'c': | ||
| 490 | mopts.malloc_canaries = 0; | ||
| 491 | break; | ||
| 492 | case 'C': | ||
| 493 | mopts.malloc_canaries = sizeof(void *); | ||
| 494 | break; | ||
| 495 | #ifdef MALLOC_STATS | ||
| 496 | case 'd': | ||
| 497 | mopts.malloc_stats = 0; | ||
| 498 | break; | ||
| 499 | case 'D': | ||
| 500 | mopts.malloc_stats = 1; | ||
| 501 | break; | ||
| 502 | #endif /* MALLOC_STATS */ | ||
| 503 | case 'f': | ||
| 504 | mopts.malloc_freenow = 0; | ||
| 505 | mopts.malloc_freeunmap = 0; | ||
| 506 | break; | ||
| 507 | case 'F': | ||
| 508 | mopts.malloc_freenow = 1; | ||
| 509 | mopts.malloc_freeunmap = 1; | ||
| 510 | break; | ||
| 511 | case 'g': | ||
| 512 | mopts.malloc_guard = 0; | ||
| 513 | break; | ||
| 514 | case 'G': | ||
| 515 | mopts.malloc_guard = MALLOC_PAGESIZE; | ||
| 516 | break; | ||
| 517 | case 'h': | ||
| 518 | mopts.malloc_hint = 0; | ||
| 519 | break; | ||
| 520 | case 'H': | ||
| 521 | mopts.malloc_hint = 1; | ||
| 522 | break; | ||
| 523 | case 'j': | ||
| 524 | mopts.malloc_junk = 0; | ||
| 525 | break; | ||
| 526 | case 'J': | ||
| 527 | mopts.malloc_junk = 2; | ||
| 528 | break; | ||
| 529 | case 'n': | ||
| 530 | case 'N': | ||
| 531 | break; | ||
| 532 | case 'p': | ||
| 533 | mopts.malloc_move = 0; | ||
| 534 | break; | ||
| 535 | case 'P': | ||
| 536 | mopts.malloc_move = 1; | ||
| 537 | break; | ||
| 538 | case 'r': | ||
| 539 | mopts.malloc_realloc = 0; | ||
| 540 | break; | ||
| 541 | case 'R': | ||
| 542 | mopts.malloc_realloc = 1; | ||
| 543 | break; | ||
| 544 | case 'u': | ||
| 545 | mopts.malloc_freeunmap = 0; | ||
| 546 | break; | ||
| 547 | case 'U': | ||
| 548 | mopts.malloc_freeunmap = 1; | ||
| 549 | break; | ||
| 550 | case 'x': | ||
| 551 | mopts.malloc_xmalloc = 0; | ||
| 552 | break; | ||
| 553 | case 'X': | ||
| 554 | mopts.malloc_xmalloc = 1; | ||
| 555 | break; | ||
| 556 | default: { | ||
| 557 | static const char q[] = "malloc() warning: " | ||
| 558 | "unknown char in MALLOC_OPTIONS\n"; | ||
| 559 | write(STDERR_FILENO, q, sizeof(q) - 1); | ||
| 560 | break; | ||
| 561 | } | ||
| 562 | } | ||
| 563 | } | ||
| 564 | |||
| 473 | /* | 565 | /* |
| 474 | * Initialize a dir_info, which should have been cleared by caller | 566 | * Initialize a dir_info, which should have been cleared by caller |
| 475 | */ | 567 | */ |
| 476 | static int | 568 | static int |
| 477 | omalloc_init(struct dir_info **dp) | 569 | omalloc_init(struct dir_info **dp) |
| 478 | { | 570 | { |
| 479 | char *p, b[64]; | 571 | char *p, *q, b[64]; |
| 480 | int i, j; | 572 | int i, j; |
| 481 | size_t d_avail, regioninfo_size; | 573 | size_t d_avail, regioninfo_size; |
| 482 | struct dir_info *d; | 574 | struct dir_info *d; |
| @@ -512,103 +604,20 @@ omalloc_init(struct dir_info **dp) | |||
| 512 | 604 | ||
| 513 | for (; p != NULL && *p != '\0'; p++) { | 605 | for (; p != NULL && *p != '\0'; p++) { |
| 514 | switch (*p) { | 606 | switch (*p) { |
| 515 | case '>': | ||
| 516 | mopts.malloc_cache <<= 1; | ||
| 517 | if (mopts.malloc_cache > MALLOC_MAXCACHE) | ||
| 518 | mopts.malloc_cache = MALLOC_MAXCACHE; | ||
| 519 | break; | ||
| 520 | case '<': | ||
| 521 | mopts.malloc_cache >>= 1; | ||
| 522 | break; | ||
| 523 | case 'a': | ||
| 524 | case 'A': | ||
| 525 | /* ignored */ | ||
| 526 | break; | ||
| 527 | case 'c': | ||
| 528 | mopts.malloc_canaries = 0; | ||
| 529 | break; | ||
| 530 | case 'C': | ||
| 531 | mopts.malloc_canaries = sizeof(void *); | ||
| 532 | break; | ||
| 533 | #ifdef MALLOC_STATS | ||
| 534 | case 'd': | ||
| 535 | mopts.malloc_stats = 0; | ||
| 536 | break; | ||
| 537 | case 'D': | ||
| 538 | mopts.malloc_stats = 1; | ||
| 539 | break; | ||
| 540 | #endif /* MALLOC_STATS */ | ||
| 541 | case 'f': | ||
| 542 | mopts.malloc_freenow = 0; | ||
| 543 | mopts.malloc_freeunmap = 0; | ||
| 544 | break; | ||
| 545 | case 'F': | ||
| 546 | mopts.malloc_freenow = 1; | ||
| 547 | mopts.malloc_freeunmap = 1; | ||
| 548 | break; | ||
| 549 | case 'g': | ||
| 550 | mopts.malloc_guard = 0; | ||
| 551 | break; | ||
| 552 | case 'G': | ||
| 553 | mopts.malloc_guard = MALLOC_PAGESIZE; | ||
| 554 | break; | ||
| 555 | case 'h': | ||
| 556 | mopts.malloc_hint = 0; | ||
| 557 | break; | ||
| 558 | case 'H': | ||
| 559 | mopts.malloc_hint = 1; | ||
| 560 | break; | ||
| 561 | case 'j': | ||
| 562 | mopts.malloc_junk = 0; | ||
| 563 | break; | ||
| 564 | case 'J': | ||
| 565 | mopts.malloc_junk = 2; | ||
| 566 | break; | ||
| 567 | case 'n': | ||
| 568 | case 'N': | ||
| 569 | break; | ||
| 570 | case 'p': | ||
| 571 | mopts.malloc_move = 0; | ||
| 572 | break; | ||
| 573 | case 'P': | ||
| 574 | mopts.malloc_move = 1; | ||
| 575 | break; | ||
| 576 | case 'r': | ||
| 577 | mopts.malloc_realloc = 0; | ||
| 578 | break; | ||
| 579 | case 'R': | ||
| 580 | mopts.malloc_realloc = 1; | ||
| 581 | break; | ||
| 582 | case 's': | ||
| 583 | mopts.malloc_freeunmap = mopts.malloc_junk = 0; | ||
| 584 | mopts.malloc_guard = 0; | ||
| 585 | mopts.malloc_cache = MALLOC_DEFAULT_CACHE; | ||
| 586 | break; | ||
| 587 | case 'S': | 607 | case 'S': |
| 588 | mopts.malloc_freeunmap = 1; | 608 | for (q = "FGJP"; *q != '\0'; q++) |
| 589 | mopts.malloc_junk = 2; | 609 | omalloc_parseopt(*q); |
| 590 | mopts.malloc_guard = MALLOC_PAGESIZE; | ||
| 591 | mopts.malloc_cache = 0; | 610 | mopts.malloc_cache = 0; |
| 592 | break; | 611 | break; |
| 593 | case 'u': | 612 | case 's': |
| 594 | mopts.malloc_freeunmap = 0; | 613 | for (q = "fgj"; *q != '\0'; q++) |
| 595 | break; | 614 | omalloc_parseopt(*q); |
| 596 | case 'U': | 615 | mopts.malloc_cache = MALLOC_DEFAULT_CACHE; |
| 597 | mopts.malloc_freeunmap = 1; | ||
| 598 | break; | ||
| 599 | case 'x': | ||
| 600 | mopts.malloc_xmalloc = 0; | ||
| 601 | break; | ||
| 602 | case 'X': | ||
| 603 | mopts.malloc_xmalloc = 1; | ||
| 604 | break; | 616 | break; |
| 605 | default: { | 617 | default: |
| 606 | static const char q[] = "malloc() warning: " | 618 | omalloc_parseopt(*p); |
| 607 | "unknown char in MALLOC_OPTIONS\n"; | ||
| 608 | write(STDERR_FILENO, q, sizeof(q) - 1); | ||
| 609 | break; | 619 | break; |
| 610 | } | 620 | } |
| 611 | } | ||
| 612 | } | 621 | } |
| 613 | } | 622 | } |
| 614 | 623 | ||
