/* emalloc.c */
#ifndef EREALLOC_CALLSITE /* ntp_malloc.h defines */
extern void * ereallocz (void *, size_t, size_t, int);
-extern void * oreallocarray (void *optr, size_t nmemb, size_t size);
+extern void * oreallocarrayx (void *optr, size_t nmemb, size_t size, size_t extra);
#define erealloczsite(p, n, o, z, f, l) ereallocz((p), (n), (o), (z))
#define emalloc(n) ereallocz(NULL, (n), 0, FALSE)
#define emalloc_zero(c) ereallocz(NULL, (c), 0, TRUE)
#define erealloc(p, c) ereallocz((p), (c), 0, FALSE)
#define erealloc_zero(p, n, o) ereallocz((p), (n), (o), TRUE)
-#define ereallocarray(p, n, s) oreallocarray((p), (n), (s))
-#define eallocarray(n, s) oreallocarray(NULL, (n), (s))
+#define ereallocarray(p, n, s) oreallocarrayx((p), (n), (s), 0)
+#define eallocarray(n, s) oreallocarrayx(NULL, (n), (s), 0)
+#define ereallocarrayx(p, n, s, x) oreallocarrayx((p), (n), (s), (x))
+#define eallocarrayx(n, s, x) oreallocarrayx(NULL, (n), (s), (x))
extern char * estrdup_impl(const char *);
#define estrdup(s) estrdup_impl(s)
#else
extern void * ereallocz (void *, size_t, size_t, int,
const char *, int);
-extern void * oreallocarray (void *optr, size_t nmemb, size_t size,
- const char *, int);
+extern void * oreallocarrayx (void *optr, size_t nmemb, size_t size,
+ size_t extra, const char *, int);
#define erealloczsite ereallocz
#define emalloc(c) ereallocz(NULL, (c), 0, FALSE, \
__FILE__, __LINE__)
#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
void *
-oreallocarray(
+oreallocarrayx(
void *optr,
size_t nmemb,
- size_t size
+ size_t size,
+ size_t extra
#ifdef EREALLOC_CALLSITE /* ntp_malloc.h */
,
const char * file,
exit(1);
}
#ifndef EREALLOC_CALLSITE
- return ereallocz(optr, (size * nmemb), 0, FALSE);
+ return ereallocz(optr, extra + (size * nmemb), 0, FALSE);
#else
- return ereallocz(optr, (size * nmemb), 0, FALSE, file, line);
+ return ereallocz(optr, extra + (size * nmemb), 0, FALSE, file, line);
#endif
}
if (res != NULL)
return res;
- rl = emalloc_zero(count * cb);
+ rl = eallocarray(count, cb);
/* link all but the first onto free list */
res = (void *)((char *)rl + (count - 1) * cb);
for (i = count - 1; i > 0; i--) {
if (res != NULL)
return res;
- rl = emalloc_zero(count * cb);
+ rl = eallocarray(count, cb);
/* link all but the first onto free list */
res = (void *)((char *)rl + (count - 1) * cb);
for (i = count - 1; i > 0; i--) {