diff options
| author | Karoly Lorentey | 2005-01-06 15:00:09 +0000 |
|---|---|---|
| committer | Karoly Lorentey | 2005-01-06 15:00:09 +0000 |
| commit | 0feecea9fb7079a2c1fbfee32a992449a22cf478 (patch) | |
| tree | 0826d68e3dc2ce370c7bd4dae7db3cffc3568321 /src/alloc.c | |
| parent | 17d51b68fb4e7da4f18eff72c589b7ffc4f9c22c (diff) | |
| parent | 1a63439b34c3455a317feda5c271dfdb7af0296b (diff) | |
| download | emacs-0feecea9fb7079a2c1fbfee32a992449a22cf478.tar.gz emacs-0feecea9fb7079a2c1fbfee32a992449a22cf478.zip | |
Merged in changes from CVS trunk.
Patches applied:
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-747
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-748
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-749
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-750
Merge from gnus--rel--5.10
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-751
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-752
Update from CVS
* miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-78
Merge from emacs--cvs-trunk--0
* miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-79
Update from CVS
* miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-80
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-278
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/src/alloc.c b/src/alloc.c index 7a6a1344d6c..eabbf5192f4 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -602,6 +602,27 @@ static char xmalloc_overrun_check_trailer[XMALLOC_OVERRUN_CHECK_SIZE] = | |||
| 602 | ((unsigned)(ptr[-4]) << 24)) | 602 | ((unsigned)(ptr[-4]) << 24)) |
| 603 | 603 | ||
| 604 | 604 | ||
| 605 | /* The call depth in overrun_check functions. For example, this might happen: | ||
| 606 | xmalloc() | ||
| 607 | overrun_check_malloc() | ||
| 608 | -> malloc -> (via hook)_-> emacs_blocked_malloc | ||
| 609 | -> overrun_check_malloc | ||
| 610 | call malloc (hooks are NULL, so real malloc is called). | ||
| 611 | malloc returns 10000. | ||
| 612 | add overhead, return 10016. | ||
| 613 | <- (back in overrun_check_malloc) | ||
| 614 | add overhead again, return 10032 | ||
| 615 | xmalloc returns 10032. | ||
| 616 | |||
| 617 | (time passes). | ||
| 618 | |||
| 619 | xfree(10032) | ||
| 620 | overrun_check_free(10032) | ||
| 621 | decrease overhed | ||
| 622 | free(10016) <- crash, because 10000 is the original pointer. */ | ||
| 623 | |||
| 624 | static int check_depth; | ||
| 625 | |||
| 605 | /* Like malloc, but wraps allocated block with header and trailer. */ | 626 | /* Like malloc, but wraps allocated block with header and trailer. */ |
| 606 | 627 | ||
| 607 | POINTER_TYPE * | 628 | POINTER_TYPE * |
| @@ -609,15 +630,17 @@ overrun_check_malloc (size) | |||
| 609 | size_t size; | 630 | size_t size; |
| 610 | { | 631 | { |
| 611 | register unsigned char *val; | 632 | register unsigned char *val; |
| 633 | size_t overhead = ++check_depth == 1 ? XMALLOC_OVERRUN_CHECK_SIZE*2 : 0; | ||
| 612 | 634 | ||
| 613 | val = (unsigned char *) malloc (size + XMALLOC_OVERRUN_CHECK_SIZE*2); | 635 | val = (unsigned char *) malloc (size + overhead); |
| 614 | if (val) | 636 | if (val && check_depth == 1) |
| 615 | { | 637 | { |
| 616 | bcopy (xmalloc_overrun_check_header, val, XMALLOC_OVERRUN_CHECK_SIZE - 4); | 638 | bcopy (xmalloc_overrun_check_header, val, XMALLOC_OVERRUN_CHECK_SIZE - 4); |
| 617 | val += XMALLOC_OVERRUN_CHECK_SIZE; | 639 | val += XMALLOC_OVERRUN_CHECK_SIZE; |
| 618 | XMALLOC_PUT_SIZE(val, size); | 640 | XMALLOC_PUT_SIZE(val, size); |
| 619 | bcopy (xmalloc_overrun_check_trailer, val + size, XMALLOC_OVERRUN_CHECK_SIZE); | 641 | bcopy (xmalloc_overrun_check_trailer, val + size, XMALLOC_OVERRUN_CHECK_SIZE); |
| 620 | } | 642 | } |
| 643 | --check_depth; | ||
| 621 | return (POINTER_TYPE *)val; | 644 | return (POINTER_TYPE *)val; |
| 622 | } | 645 | } |
| 623 | 646 | ||
| @@ -631,8 +654,10 @@ overrun_check_realloc (block, size) | |||
| 631 | size_t size; | 654 | size_t size; |
| 632 | { | 655 | { |
| 633 | register unsigned char *val = (unsigned char *)block; | 656 | register unsigned char *val = (unsigned char *)block; |
| 657 | size_t overhead = ++check_depth == 1 ? XMALLOC_OVERRUN_CHECK_SIZE*2 : 0; | ||
| 634 | 658 | ||
| 635 | if (val | 659 | if (val |
| 660 | && check_depth == 1 | ||
| 636 | && bcmp (xmalloc_overrun_check_header, | 661 | && bcmp (xmalloc_overrun_check_header, |
| 637 | val - XMALLOC_OVERRUN_CHECK_SIZE, | 662 | val - XMALLOC_OVERRUN_CHECK_SIZE, |
| 638 | XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0) | 663 | XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0) |
| @@ -647,15 +672,16 @@ overrun_check_realloc (block, size) | |||
| 647 | bzero (val, XMALLOC_OVERRUN_CHECK_SIZE); | 672 | bzero (val, XMALLOC_OVERRUN_CHECK_SIZE); |
| 648 | } | 673 | } |
| 649 | 674 | ||
| 650 | val = (unsigned char *) realloc ((POINTER_TYPE *)val, size + XMALLOC_OVERRUN_CHECK_SIZE*2); | 675 | val = (unsigned char *) realloc ((POINTER_TYPE *)val, size + overhead); |
| 651 | 676 | ||
| 652 | if (val) | 677 | if (val && check_depth == 1) |
| 653 | { | 678 | { |
| 654 | bcopy (xmalloc_overrun_check_header, val, XMALLOC_OVERRUN_CHECK_SIZE - 4); | 679 | bcopy (xmalloc_overrun_check_header, val, XMALLOC_OVERRUN_CHECK_SIZE - 4); |
| 655 | val += XMALLOC_OVERRUN_CHECK_SIZE; | 680 | val += XMALLOC_OVERRUN_CHECK_SIZE; |
| 656 | XMALLOC_PUT_SIZE(val, size); | 681 | XMALLOC_PUT_SIZE(val, size); |
| 657 | bcopy (xmalloc_overrun_check_trailer, val + size, XMALLOC_OVERRUN_CHECK_SIZE); | 682 | bcopy (xmalloc_overrun_check_trailer, val + size, XMALLOC_OVERRUN_CHECK_SIZE); |
| 658 | } | 683 | } |
| 684 | --check_depth; | ||
| 659 | return (POINTER_TYPE *)val; | 685 | return (POINTER_TYPE *)val; |
| 660 | } | 686 | } |
| 661 | 687 | ||
| @@ -667,7 +693,9 @@ overrun_check_free (block) | |||
| 667 | { | 693 | { |
| 668 | unsigned char *val = (unsigned char *)block; | 694 | unsigned char *val = (unsigned char *)block; |
| 669 | 695 | ||
| 696 | ++check_depth; | ||
| 670 | if (val | 697 | if (val |
| 698 | && check_depth == 1 | ||
| 671 | && bcmp (xmalloc_overrun_check_header, | 699 | && bcmp (xmalloc_overrun_check_header, |
| 672 | val - XMALLOC_OVERRUN_CHECK_SIZE, | 700 | val - XMALLOC_OVERRUN_CHECK_SIZE, |
| 673 | XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0) | 701 | XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0) |
| @@ -683,6 +711,7 @@ overrun_check_free (block) | |||
| 683 | } | 711 | } |
| 684 | 712 | ||
| 685 | free (val); | 713 | free (val); |
| 714 | --check_depth; | ||
| 686 | } | 715 | } |
| 687 | 716 | ||
| 688 | #undef malloc | 717 | #undef malloc |