diff options
-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 | ||