aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorKaroly Lorentey2005-01-06 15:00:09 +0000
committerKaroly Lorentey2005-01-06 15:00:09 +0000
commit0feecea9fb7079a2c1fbfee32a992449a22cf478 (patch)
tree0826d68e3dc2ce370c7bd4dae7db3cffc3568321 /src/alloc.c
parent17d51b68fb4e7da4f18eff72c589b7ffc4f9c22c (diff)
parent1a63439b34c3455a317feda5c271dfdb7af0296b (diff)
downloademacs-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.c37
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
624static 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
607POINTER_TYPE * 628POINTER_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