#include <stdlib.h>
#include <string.h>
#include "mmprivate.h"
#define MAGICWORD (unsigned int) 0xfedabeeb
#define MAGICWORDFREE (unsigned int) 0xdeadbeef
#define MAGICBYTE ((char) 0xd7)
struct hdr
{
size_t size;
unsigned long int magic;
};
static void checkhdr PARAMS ((struct mdesc *, CONST struct hdr *));
static void mfree_check PARAMS ((PTR, PTR));
static PTR mmalloc_check PARAMS ((PTR, size_t));
static PTR mrealloc_check PARAMS ((PTR, PTR, size_t));
static void
checkhdr (mdp, hdr)
struct mdesc *mdp;
CONST struct hdr *hdr;
{
if (hdr -> magic != MAGICWORD ||
((char *) &hdr[1])[hdr -> size] != MAGICBYTE)
{
(*mdp -> abortfunc)();
}
}
static void
mfree_check (md, ptr)
PTR md;
PTR ptr;
{
struct hdr *hdr = ((struct hdr *) ptr) - 1;
struct mdesc *mdp = (struct mdesc *) md;
checkhdr (mdp, hdr);
hdr->magic = MAGICWORDFREE;
mfree (mdp->child, (PTR) hdr);
}
static PTR
mmalloc_check (md, size)
PTR md;
size_t size;
{
struct hdr *hdr;
struct mdesc *mdp = (struct mdesc *) md;
size_t nbytes = sizeof (struct hdr) + size + 1;
hdr = (struct hdr *) mmalloc (mdp->child, nbytes);
if (hdr != NULL)
{
hdr->size = size;
hdr->magic = MAGICWORD;
hdr++;
*((char *) hdr + size) = MAGICBYTE;
}
return ((PTR) hdr);
}
static PTR
mrealloc_check (md, ptr, size)
PTR md;
PTR ptr;
size_t size;
{
struct hdr *hdr = ((struct hdr *) ptr) - 1;
struct mdesc *mdp = (struct mdesc *) md;
size_t nbytes = sizeof (struct hdr) + size + 1;
checkhdr (mdp, hdr);
hdr = (struct hdr *) mrealloc (mdp->child, (PTR) hdr, nbytes);
if (hdr != NULL)
{
hdr->size = size;
hdr++;
*((char *) hdr + size) = MAGICBYTE;
}
return ((PTR) hdr);
}
struct mdesc *
mmalloc_check_create (struct mdesc *child)
{
struct mdesc *ret = NULL;
ret = (struct mdesc *) malloc (sizeof (struct mdesc));
memset ((char *) ret, 0, sizeof (struct mdesc));
ret->child = child;
ret->mfree_hook = mfree_check;
ret->mmalloc_hook = mmalloc_check;
ret->mrealloc_hook = mrealloc_check;
ret->abortfunc = abort;
if (child != NULL)
ret->flags = child->flags;
return ret;
}