mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-26 23:31:55 -08:00
(lisp_align_malloc): Check for memory full when
allocating ablocks, which also avoids freeing a pointer into an ablocks structure.
This commit is contained in:
parent
c5788e99da
commit
f4446bbf6f
2 changed files with 23 additions and 15 deletions
|
|
@ -1,5 +1,11 @@
|
|||
2003-08-19 Gerd Moellmann <gerd@gnu.org>
|
||||
|
||||
* alloc.c (lisp_align_malloc): Check for memory full when
|
||||
allocating ablocks, which also avoids freeing a pointer into an
|
||||
ablocks structure.
|
||||
|
||||
* puresize.h (BASE_PURESIZE): Increase to 1100000.
|
||||
|
||||
* buffer.c (Fmove_overlay): Set overlay's next pointer
|
||||
unconditionally.
|
||||
|
||||
|
|
|
|||
32
src/alloc.c
32
src/alloc.c
|
|
@ -766,6 +766,23 @@ lisp_align_malloc (nbytes, type)
|
|||
mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
|
||||
#endif
|
||||
|
||||
/* If the memory just allocated cannot be addressed thru a Lisp
|
||||
object's pointer, and it needs to be, that's equivalent to
|
||||
running out of memory. */
|
||||
if (type != MEM_TYPE_NON_LISP)
|
||||
{
|
||||
Lisp_Object tem;
|
||||
char *end = (char *) base + ABLOCKS_BYTES - 1;
|
||||
XSETCONS (tem, end);
|
||||
if ((char *) XCONS (tem) != end)
|
||||
{
|
||||
lisp_malloc_loser = base;
|
||||
free (base);
|
||||
UNBLOCK_INPUT;
|
||||
memory_full ();
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize the blocks and put them on the free list.
|
||||
Is `base' was not properly aligned, we can't use the last block. */
|
||||
for (i = 0; i < (aligned ? ABLOCKS_SIZE : ABLOCKS_SIZE - 1); i++)
|
||||
|
|
@ -788,21 +805,6 @@ lisp_align_malloc (nbytes, type)
|
|||
val = free_ablock;
|
||||
free_ablock = free_ablock->x.next_free;
|
||||
|
||||
/* If the memory just allocated cannot be addressed thru a Lisp
|
||||
object's pointer, and it needs to be,
|
||||
that's equivalent to running out of memory. */
|
||||
if (val && type != MEM_TYPE_NON_LISP)
|
||||
{
|
||||
Lisp_Object tem;
|
||||
XSETCONS (tem, (char *) val + nbytes - 1);
|
||||
if ((char *) XCONS (tem) != (char *) val + nbytes - 1)
|
||||
{
|
||||
lisp_malloc_loser = val;
|
||||
free (val);
|
||||
val = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
|
||||
if (val && type != MEM_TYPE_NON_LISP)
|
||||
mem_insert (val, (char *) val + nbytes, type);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue