diff --git a/lib/isc/include/isc/mem.h b/lib/isc/include/isc/mem.h index 2aee5fb00c..4c50bfaf35 100644 --- a/lib/isc/include/isc/mem.h +++ b/lib/isc/include/isc/mem.h @@ -604,6 +604,27 @@ char *ISCMEMFUNC(strndup)(isc_mem_t *, const char *, size_t _ISC_MEM_FLARG); void *ISCMEMPOOLFUNC(get)(isc_mempool_t *_ISC_MEM_FLARG); void ISCMEMPOOLFUNC(put)(isc_mempool_t *, void *_ISC_MEM_FLARG); +/* + * Memory management routines using default memory context + */ + +#define isc_malloc(size) isc__malloc((size)_ISC_MEM_FILELINE) +#define isc_calloc(num, size) isc__calloc((num), (size)_ISC_MEM_FILELINE) +#define isc_realloc(ptr, size) isc__realloc((ptr), (size)_ISC_MEM_FILELINE) +#define isc_free(ptr) isc__free((ptr)_ISC_MEM_FILELINE) +#define isc_strdup(str) isc__strdup((str)_ISC_MEM_FILELINE) + +void * +isc__malloc(size_t size _ISC_MEM_FLARG); +void * +isc__calloc(size_t num, size_t size _ISC_MEM_FLARG); +void * +isc__realloc(void *ptr, size_t size _ISC_MEM_FLARG); +void +isc__free(void *ptr _ISC_MEM_FLARG); +char * +isc__strdup(const char *str _ISC_MEM_FLARG); + ISC_LANG_ENDDECLS #endif /* ISC_MEM_H */ diff --git a/lib/isc/include/isc/util.h b/lib/isc/include/isc/util.h index 8941ec125e..b88cc51aff 100644 --- a/lib/isc/include/isc/util.h +++ b/lib/isc/include/isc/util.h @@ -48,6 +48,14 @@ #define ISC_NONSTRING #endif /* __GNUC__ */ +#if __GNUC__ +#define ISC_CONSTRUCTOR(priority) __attribute__((constructor(priority))) +#define ISC_DESTRUCTOR(priority) __attribute__((destructor(priority))) +#else +#define ISC_CONSTRUCTOR(priority) +#define ISC_DESTRUCTOR(priority) +#endif + /*% * The opposite: silent warnings about stored values which are never read. */ @@ -340,6 +348,15 @@ mock_assert(const int result, const char *const expression, #define ISC_ALIGN(x, a) (((x) + (a)-1) & ~((uintmax_t)(a)-1)) #endif /* ifdef __GNUC__ */ +/*% + * Overflow checks + */ +#if __has_builtin(__builtin_add_overflow) || __GNUC__ >= 5 +#define ISC_MUL_OVERFLOW(a, b, res) __builtin_mul_overflow(a, b, res) +#else +#define ISC_MUL_OVERFLOW(a, b, res) ((*res) = (a) * (b)) +#endif + /*% * Misc */ diff --git a/lib/isc/mem.c b/lib/isc/mem.c index 879b6232f9..1afea66d66 100644 --- a/lib/isc/mem.c +++ b/lib/isc/mem.c @@ -2520,3 +2520,60 @@ isc__mem_printactive(isc_mem_t *ctx0, FILE *file) { UNUSED(file); #endif /* if ISC_MEM_TRACKLINES */ } + +/* + * Routines using default memory context + */ + +static isc_mem_t *isc__mem_mctx = NULL; + +void +isc__mem_initialize(void); +void +isc__mem_shutdown(void); + +ISC_CONSTRUCTOR(101) +void +isc__mem_initialize(void) { + REQUIRE(isc__mem_mctx == NULL); + isc_mem_create(&isc__mem_mctx); + isc_mem_setname(isc__mem_mctx, "default", NULL); +} + +ISC_DESTRUCTOR(101) +void +isc__mem_shutdown(void) { + REQUIRE(isc__mem_mctx != NULL); + isc_mem_destroy(&isc__mem_mctx); + isc_mem_checkdestroyed(stderr); +} + +void * +isc__malloc(size_t size FLARG) { + return (isc__mem_allocate(isc__mem_mctx, size FLARG_PASS)); +} + +void * +isc__calloc(size_t num, size_t size FLARG) { + size_t numsize; + + ISC_MUL_OVERFLOW(num, size, &numsize); + void *ptr = isc__mem_allocate(isc__mem_mctx, numsize FLARG_PASS); + memset(ptr, 0, numsize); + return (ptr); +} + +void * +isc__realloc(void *ptr, size_t size FLARG) { + return (isc__mem_reallocate(isc__mem_mctx, ptr, size FLARG_PASS)); +} + +void +isc__free(void *ptr FLARG) { + isc__mem_free(isc__mem_mctx, ptr FLARG_PASS); +} + +char * +isc__strdup(const char *s1 FLARG) { + return (isc__mem_strdup(isc__mem_mctx, s1 FLARG_PASS)); +} diff --git a/lib/isc/win32/DLLMain.c b/lib/isc/win32/DLLMain.c index 3acfee4f46..e6caeec346 100644 --- a/lib/isc/win32/DLLMain.c +++ b/lib/isc/win32/DLLMain.c @@ -12,6 +12,11 @@ #include #include +void +isc__mem_initialize(void); +void +isc__mem_shutdown(void); + /* * Called when we enter the DLL */ @@ -27,6 +32,7 @@ __declspec(dllexport) BOOL WINAPI * Disable DllMain() invocation on Thread creation/destruction */ DisableThreadLibraryCalls(hinstDLL); + isc__mem_initialize(); /* priority=101 */ break; /* @@ -34,6 +40,7 @@ __declspec(dllexport) BOOL WINAPI * termination or a call to FreeLibrary. */ case DLL_PROCESS_DETACH: + isc__mem_shutdown(); /* priority=101 */ break; case DLL_THREAD_ATTACH: