Blame memory.c

Packit 15dc08
/* Memory allocation routines.
Packit 15dc08
Packit 15dc08
Copyright 1991, 1993, 1994, 2000-2002, 2012 Free Software Foundation, Inc.
Packit 15dc08
Packit 15dc08
This file is part of the GNU MP Library.
Packit 15dc08
Packit 15dc08
The GNU MP Library is free software; you can redistribute it and/or modify
Packit 15dc08
it under the terms of either:
Packit 15dc08
Packit 15dc08
  * the GNU Lesser General Public License as published by the Free
Packit 15dc08
    Software Foundation; either version 3 of the License, or (at your
Packit 15dc08
    option) any later version.
Packit 15dc08
Packit 15dc08
or
Packit 15dc08
Packit 15dc08
  * the GNU General Public License as published by the Free Software
Packit 15dc08
    Foundation; either version 2 of the License, or (at your option) any
Packit 15dc08
    later version.
Packit 15dc08
Packit 15dc08
or both in parallel, as here.
Packit 15dc08
Packit 15dc08
The GNU MP Library is distributed in the hope that it will be useful, but
Packit 15dc08
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 15dc08
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit 15dc08
for more details.
Packit 15dc08
Packit 15dc08
You should have received copies of the GNU General Public License and the
Packit 15dc08
GNU Lesser General Public License along with the GNU MP Library.  If not,
Packit 15dc08
see https://www.gnu.org/licenses/.  */
Packit 15dc08
Packit 15dc08
#include <stdio.h>
Packit 15dc08
#include <stdlib.h> /* for malloc, realloc, free */
Packit 15dc08
Packit 15dc08
#include "gmp.h"
Packit 15dc08
#include "gmp-impl.h"
Packit 15dc08
Packit 15dc08
Packit 15dc08
void * (*__gmp_allocate_func) (size_t) = __gmp_default_allocate;
Packit 15dc08
void * (*__gmp_reallocate_func) (void *, size_t, size_t) = __gmp_default_reallocate;
Packit 15dc08
void   (*__gmp_free_func) (void *, size_t) = __gmp_default_free;
Packit 15dc08
Packit 15dc08
Packit 15dc08
/* Default allocation functions.  In case of failure to allocate/reallocate
Packit 15dc08
   an error message is written to stderr and the program aborts.  */
Packit 15dc08
Packit 15dc08
void *
Packit 15dc08
__gmp_default_allocate (size_t size)
Packit 15dc08
{
Packit 15dc08
  void *ret;
Packit 15dc08
#ifdef DEBUG
Packit 15dc08
  size_t req_size = size;
Packit 15dc08
  size += 2 * GMP_LIMB_BYTES;
Packit 15dc08
#endif
Packit 15dc08
  ret = malloc (size);
Packit 15dc08
  if (ret == 0)
Packit 15dc08
    {
Packit 15dc08
      fprintf (stderr, "GNU MP: Cannot allocate memory (size=%lu)\n", (long) size);
Packit 15dc08
      abort ();
Packit 15dc08
    }
Packit 15dc08
Packit 15dc08
#ifdef DEBUG
Packit 15dc08
  {
Packit 15dc08
    mp_ptr p = ret;
Packit 15dc08
    p++;
Packit 15dc08
    p[-1] = (0xdeadbeef << 31) + 0xdeafdeed;
Packit 15dc08
    if (req_size % GMP_LIMB_BYTES == 0)
Packit 15dc08
      p[req_size / GMP_LIMB_BYTES] = ~((0xdeadbeef << 31) + 0xdeafdeed);
Packit 15dc08
    ret = p;
Packit 15dc08
  }
Packit 15dc08
#endif
Packit 15dc08
  return ret;
Packit 15dc08
}
Packit 15dc08
Packit 15dc08
void *
Packit 15dc08
__gmp_default_reallocate (void *oldptr, size_t old_size, size_t new_size)
Packit 15dc08
{
Packit 15dc08
  void *ret;
Packit 15dc08
Packit 15dc08
#ifdef DEBUG
Packit 15dc08
  size_t req_size = new_size;
Packit 15dc08
Packit 15dc08
  if (old_size != 0)
Packit 15dc08
    {
Packit 15dc08
      mp_ptr p = oldptr;
Packit 15dc08
      if (p[-1] != (0xdeadbeef << 31) + 0xdeafdeed)
Packit 15dc08
	{
Packit 15dc08
	  fprintf (stderr, "gmp: (realloc) data clobbered before allocation block\n");
Packit 15dc08
	  abort ();
Packit 15dc08
	}
Packit 15dc08
      if (old_size % GMP_LIMB_BYTES == 0)
Packit 15dc08
	if (p[old_size / GMP_LIMB_BYTES] != ~((0xdeadbeef << 31) + 0xdeafdeed))
Packit 15dc08
	  {
Packit 15dc08
	    fprintf (stderr, "gmp: (realloc) data clobbered after allocation block\n");
Packit 15dc08
	    abort ();
Packit 15dc08
	  }
Packit 15dc08
      oldptr = p - 1;
Packit 15dc08
    }
Packit 15dc08
Packit 15dc08
  new_size += 2 * GMP_LIMB_BYTES;
Packit 15dc08
#endif
Packit 15dc08
Packit 15dc08
  ret = realloc (oldptr, new_size);
Packit 15dc08
  if (ret == 0)
Packit 15dc08
    {
Packit 15dc08
      fprintf (stderr, "GNU MP: Cannot reallocate memory (old_size=%lu new_size=%lu)\n", (long) old_size, (long) new_size);
Packit 15dc08
      abort ();
Packit 15dc08
    }
Packit 15dc08
Packit 15dc08
#ifdef DEBUG
Packit 15dc08
  {
Packit 15dc08
    mp_ptr p = ret;
Packit 15dc08
    p++;
Packit 15dc08
    p[-1] = (0xdeadbeef << 31) + 0xdeafdeed;
Packit 15dc08
    if (req_size % GMP_LIMB_BYTES == 0)
Packit 15dc08
      p[req_size / GMP_LIMB_BYTES] = ~((0xdeadbeef << 31) + 0xdeafdeed);
Packit 15dc08
    ret = p;
Packit 15dc08
  }
Packit 15dc08
#endif
Packit 15dc08
  return ret;
Packit 15dc08
}
Packit 15dc08
Packit 15dc08
void
Packit 15dc08
__gmp_default_free (void *blk_ptr, size_t blk_size)
Packit 15dc08
{
Packit 15dc08
#ifdef DEBUG
Packit 15dc08
  {
Packit 15dc08
    mp_ptr p = blk_ptr;
Packit 15dc08
    if (blk_size != 0)
Packit 15dc08
      {
Packit 15dc08
	if (p[-1] != (0xdeadbeef << 31) + 0xdeafdeed)
Packit 15dc08
	  {
Packit 15dc08
	    fprintf (stderr, "gmp: (free) data clobbered before allocation block\n");
Packit 15dc08
	    abort ();
Packit 15dc08
	  }
Packit 15dc08
	if (blk_size % GMP_LIMB_BYTES == 0)
Packit 15dc08
	  if (p[blk_size / GMP_LIMB_BYTES] != ~((0xdeadbeef << 31) + 0xdeafdeed))
Packit 15dc08
	    {
Packit 15dc08
	      fprintf (stderr, "gmp: (free) data clobbered after allocation block\n");
Packit 15dc08
	      abort ();
Packit 15dc08
	    }
Packit 15dc08
      }
Packit 15dc08
    blk_ptr = p - 1;
Packit 15dc08
  }
Packit 15dc08
#endif
Packit 15dc08
  free (blk_ptr);
Packit 15dc08
}