1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
/* $Id: malloc.C,v 1.8 2001/08/19 00:27:16 dm Exp $ */
#include "amisc.h"
#ifdef DMALLOC
bool dmalloc_init::initialized;
void
dmalloc_init::init ()
{
if (suidsafe () < 0
&& (getenv ("DMALLOC_OPTIONS") || getenv ("STKTRACE"))) {
setgid (getgid ());
setuid (getuid ());
const char msg[] = "setuid disabled for malloc debugging\n";
write (2, msg, sizeof (msg) - 1);
}
initialized = true;
}
#endif /* DMALLOC */
/* The xmalloc handler will have no effect when dmalloc is used, but
* we leave it in for compatibility. */
static void
default_xmalloc_handler (int size)
{
const char msg[] = "malloc failed\n";
write (errfd, msg, sizeof (msg) - 1);
abort ();
}
void (*xmalloc_handler) (int) = default_xmalloc_handler;
#ifdef DMALLOC
#undef new
dmalloc_t dmalloc;
void *
operator new (size_t size, dmalloc_t, const char *file, int line)
{
/* As per the C++ standard, allocating 0 bytes must not return NULL,
* and must return a different pointer each time... */
if (!size)
size = 1;
return _xmalloc_leap (file, line, size);
}
void *
operator new[] (size_t size, dmalloc_t, const char *file, int line)
{
if (!size)
size = 1;
return _xmalloc_leap (file, line, size);
}
#else /* !DMALLOC */
void *
xmalloc (size_t size)
{
void *p;
if (!(p = malloc (size)))
default_xmalloc_handler (size);
return p;
}
void *
xrealloc (void *o, size_t size)
{
void *p;
if (!(p = realloc (o, size)))
default_xmalloc_handler (size);
return p;
}
char *
xstrdup (const char *s)
{
char *d;
d = (char *) xmalloc (strlen (s) + 1);
strcpy (d, s);
return d;
}
#endif /* !DMALLOC */
using std::bad_alloc;
void *
operator new (size_t size) throw (bad_alloc)
{
if (!size)
size = 1;
return txmalloc (size);
}
void *
operator new[] (size_t size) throw (bad_alloc)
{
if (!size)
size = 1;
return txmalloc (size);
}
void
operator delete (void *ptr)
{
xfree (ptr);
}
void
operator delete[] (void *ptr)
{
xfree (ptr);
}
|