mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-23 02:28:55 +00:00
The libxml2 library provides a way to replace the default allocator with user supplied allocator (malloc, realloc, strdup and free). Create a memory context specifically for libxml2 to allow tracking the memory usage that has originated from within libxml2. This will provide a separate memory context for libxml2 to track the allocations and when shutting down the application it will check that all libxml2 allocations were returned to the allocator. Additionally, move the xmlInitParser() and xmlCleanupParser() calls from bin/named/main.c to library constructor/destructor in libisc library.
80 lines
1.7 KiB
C
80 lines
1.7 KiB
C
/*
|
|
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
|
|
*
|
|
* SPDX-License-Identifier: MPL-2.0
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
|
|
*
|
|
* See the COPYRIGHT file distributed with this work for additional
|
|
* information regarding copyright ownership.
|
|
*/
|
|
|
|
#include <isc/mem.h>
|
|
#include <isc/util.h>
|
|
#include <isc/xml.h>
|
|
|
|
#ifdef HAVE_LIBXML2
|
|
#include <libxml/parser.h>
|
|
#include <libxml/xmlversion.h>
|
|
|
|
static isc_mem_t *isc__xml_mctx = NULL;
|
|
|
|
static void *
|
|
isc__xml_malloc(size_t size) {
|
|
return (isc_mem_allocate(isc__xml_mctx, size));
|
|
}
|
|
|
|
static void *
|
|
isc__xml_realloc(void *ptr, size_t size) {
|
|
return (isc_mem_reallocate(isc__xml_mctx, ptr, size));
|
|
}
|
|
|
|
static char *
|
|
isc__xml_strdup(const char *str) {
|
|
return (isc_mem_strdup(isc__xml_mctx, str));
|
|
}
|
|
|
|
static void
|
|
isc__xml_free(void *ptr) {
|
|
if (ptr == NULL) {
|
|
return;
|
|
}
|
|
isc_mem_free(isc__xml_mctx, ptr);
|
|
}
|
|
|
|
#endif /* HAVE_LIBXML2 */
|
|
|
|
void
|
|
isc__xml_initialize(void) {
|
|
#ifdef HAVE_LIBXML2
|
|
isc_mem_create(&isc__xml_mctx);
|
|
isc_mem_setname(isc__xml_mctx, "libxml2");
|
|
isc_mem_setdestroycheck(isc__xml_mctx, false);
|
|
|
|
RUNTIME_CHECK(xmlGcMemSetup(isc__xml_free, isc__xml_malloc,
|
|
isc__xml_malloc, isc__xml_realloc,
|
|
isc__xml_strdup) == 0);
|
|
|
|
xmlInitParser();
|
|
#endif /* HAVE_LIBXML2 */
|
|
}
|
|
|
|
void
|
|
isc__xml_shutdown(void) {
|
|
#ifdef HAVE_LIBXML2
|
|
xmlCleanupParser();
|
|
isc_mem_destroy(&isc__xml_mctx);
|
|
#endif /* HAVE_LIBXML2 */
|
|
}
|
|
|
|
void
|
|
isc__xml_setdestroycheck(bool check) {
|
|
#ifdef HAVE_LIBXML2
|
|
isc_mem_setdestroycheck(isc__xml_mctx, check);
|
|
#else
|
|
UNUSED(check);
|
|
#endif
|
|
}
|