110 #define SIGNATURE 0xdead
113 #define CHECK_IN_PTR(ptr, real_ptr, len, fname) { \
115 msg_panic("%s: null pointer input", fname); \
116 real_ptr = (MBLOCK *) (ptr - offsetof(MBLOCK, u.payload[0])); \
117 if (real_ptr->signature != SIGNATURE) \
118 msg_panic("%s: corrupt or unallocated memory block", fname); \
119 real_ptr->signature = 0; \
120 if ((len = real_ptr->length) < 1) \
121 msg_panic("%s: corrupt memory block length", fname); \
124 #define CHECK_OUT_PTR(ptr, real_ptr, len) { \
125 real_ptr->signature = SIGNATURE; \
126 real_ptr->length = len; \
127 ptr = real_ptr->u.payload; \
130 #define SPACE_FOR(len) (offsetof(MBLOCK, u.payload[0]) + len)
143 #ifndef NO_SHARED_EMPTY_STRINGS
144 static const char empty_string[] =
"";
161 msg_panic(
"mymalloc: requested length %ld", (
long) len);
163 len += MYMALLOC_FUZZ;
166 msg_fatal(
"mymalloc: insufficient memory for %ld bytes: %m",
180 #ifndef NO_SHARED_EMPTY_STRINGS
181 if (ptr == empty_string)
191 msg_panic(
"myrealloc: requested length %ld", (
long) len);
193 len += MYMALLOC_FUZZ;
196 if ((real_ptr = (
MBLOCK *) realloc((
void *) real_ptr,
SPACE_FOR(len))) == 0)
197 msg_fatal(
"myrealloc: insufficient memory for %ld bytes: %m",
201 memset(ptr + old_len,
FILLER, len - old_len);
212 #ifndef NO_SHARED_EMPTY_STRINGS
213 if (ptr != empty_string) {
217 free((
void *) real_ptr);
218 #ifndef NO_SHARED_EMPTY_STRINGS
230 msg_panic(
"mystrdup: null pointer argument");
231 #ifndef NO_SHARED_EMPTY_STRINGS
233 return ((
char *) empty_string);
236 msg_panic(
"mystrdup: string length >= SSIZE_T_MAX");
237 return (strcpy(
mymalloc(len), str));
248 msg_panic(
"mystrndup: null pointer argument");
250 msg_panic(
"mystrndup: requested length %ld", (
long) len);
251 #ifndef NO_SHARED_EMPTY_STRINGS
253 return ((
char *) empty_string);
255 if ((cp = memchr(str, 0, len)) != 0)
257 result = memcpy(
mymalloc(len + 1), str, len);
267 msg_panic(
"mymemdup: null pointer argument");
268 return (memcpy(
mymalloc(len), ptr, len));
char * mystrdup(const char *str)
NORETURN msg_panic(const char *fmt,...)
void * myrealloc(void *ptr, ssize_t len)
#define CHECK_OUT_PTR(ptr, real_ptr, len)
#define CHECK_IN_PTR(ptr, real_ptr, len, fname)
NORETURN msg_fatal(const char *fmt,...)
char * mystrndup(const char *str, ssize_t len)
char * mymemdup(const void *ptr, ssize_t len)
void * mymalloc(ssize_t len)