[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/alloc.c
From: |
Jan Djärv |
Subject: |
[Emacs-diffs] Changes to emacs/src/alloc.c |
Date: |
Sat, 25 Dec 2004 05:51:24 -0500 |
Index: emacs/src/alloc.c
diff -c emacs/src/alloc.c:1.357 emacs/src/alloc.c:1.358
*** emacs/src/alloc.c:1.357 Tue Dec 21 11:30:31 2004
--- emacs/src/alloc.c Sat Dec 25 10:13:57 2004
***************
*** 601,606 ****
--- 601,625 ----
((unsigned)(ptr[-4]) << 24))
+ /* The call depth in overrun_check functions. Realloc may call both malloc
+ and free. If realloc calls malloc, this may happen:
+ overrun_check_realloc()
+ -> malloc -> (via hook)_-> emacs_blocked_malloc
+ -> overrun_check_malloc
+ call malloc (hooks are NULL, so real malloc is called).
+ malloc returns 10000.
+ add overhead, return 10016.
+ <- (back in overrun_check_realloc)
+ add overhead again, return 10032
+
+ (time passes).
+
+ overrun_check_free(10032)
+ decrease overhed
+ free(10016) <- crash, because 10000 is the original pointer. */
+
+ static int check_depth;
+
/* Like malloc, but wraps allocated block with header and trailer. */
POINTER_TYPE *
***************
*** 608,622 ****
size_t size;
{
register unsigned char *val;
! val = (unsigned char *) malloc (size + XMALLOC_OVERRUN_CHECK_SIZE*2);
! if (val)
{
bcopy (xmalloc_overrun_check_header, val, XMALLOC_OVERRUN_CHECK_SIZE -
4);
val += XMALLOC_OVERRUN_CHECK_SIZE;
XMALLOC_PUT_SIZE(val, size);
bcopy (xmalloc_overrun_check_trailer, val + size,
XMALLOC_OVERRUN_CHECK_SIZE);
}
return (POINTER_TYPE *)val;
}
--- 627,643 ----
size_t size;
{
register unsigned char *val;
+ size_t overhead = ++check_depth == 1 ? XMALLOC_OVERRUN_CHECK_SIZE*2 : 0;
! val = (unsigned char *) malloc (size + overhead);
! if (val && check_depth == 1)
{
bcopy (xmalloc_overrun_check_header, val, XMALLOC_OVERRUN_CHECK_SIZE -
4);
val += XMALLOC_OVERRUN_CHECK_SIZE;
XMALLOC_PUT_SIZE(val, size);
bcopy (xmalloc_overrun_check_trailer, val + size,
XMALLOC_OVERRUN_CHECK_SIZE);
}
+ --check_depth;
return (POINTER_TYPE *)val;
}
***************
*** 630,637 ****
--- 651,660 ----
size_t size;
{
register unsigned char *val = (unsigned char *)block;
+ size_t overhead = ++check_depth == 1 ? XMALLOC_OVERRUN_CHECK_SIZE*2 : 0;
if (val
+ && check_depth == 1
&& bcmp (xmalloc_overrun_check_header,
val - XMALLOC_OVERRUN_CHECK_SIZE,
XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0)
***************
*** 646,660 ****
bzero (val, XMALLOC_OVERRUN_CHECK_SIZE);
}
! val = (unsigned char *) realloc ((POINTER_TYPE *)val, size +
XMALLOC_OVERRUN_CHECK_SIZE*2);
! if (val)
{
bcopy (xmalloc_overrun_check_header, val, XMALLOC_OVERRUN_CHECK_SIZE -
4);
val += XMALLOC_OVERRUN_CHECK_SIZE;
XMALLOC_PUT_SIZE(val, size);
bcopy (xmalloc_overrun_check_trailer, val + size,
XMALLOC_OVERRUN_CHECK_SIZE);
}
return (POINTER_TYPE *)val;
}
--- 669,684 ----
bzero (val, XMALLOC_OVERRUN_CHECK_SIZE);
}
! val = (unsigned char *) realloc ((POINTER_TYPE *)val, size + overhead);
! if (val && check_depth == 1)
{
bcopy (xmalloc_overrun_check_header, val, XMALLOC_OVERRUN_CHECK_SIZE -
4);
val += XMALLOC_OVERRUN_CHECK_SIZE;
XMALLOC_PUT_SIZE(val, size);
bcopy (xmalloc_overrun_check_trailer, val + size,
XMALLOC_OVERRUN_CHECK_SIZE);
}
+ --check_depth;
return (POINTER_TYPE *)val;
}
***************
*** 666,672 ****
--- 690,698 ----
{
unsigned char *val = (unsigned char *)block;
+ ++check_depth;
if (val
+ && check_depth == 1
&& bcmp (xmalloc_overrun_check_header,
val - XMALLOC_OVERRUN_CHECK_SIZE,
XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0)
***************
*** 682,687 ****
--- 708,714 ----
}
free (val);
+ --check_depth;
}
#undef malloc
- [Emacs-diffs] Changes to emacs/src/alloc.c, Kim F . Storm, 2004/12/01
- [Emacs-diffs] Changes to emacs/src/alloc.c, Jan Djärv, 2004/12/07
- [Emacs-diffs] Changes to emacs/src/alloc.c, Jan Djärv, 2004/12/07
- [Emacs-diffs] Changes to emacs/src/alloc.c, Jan Djärv, 2004/12/15
- [Emacs-diffs] Changes to emacs/src/alloc.c, Richard M . Stallman, 2004/12/21
- [Emacs-diffs] Changes to emacs/src/alloc.c, Jan Djärv, 2004/12/25
- [Emacs-diffs] Changes to emacs/src/alloc.c,
Jan Djärv <=