Use custom isc_mem based allocator for libxml2

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.
This commit is contained in:
Ondřej Surý
2022-09-23 14:36:54 +02:00
parent 236d4b7739
commit e537fea861
5 changed files with 110 additions and 8 deletions

View File

@@ -105,6 +105,7 @@ libisc_la_HEADERS = \
include/isc/utf8.h \
include/isc/util.h \
include/isc/uv.h \
include/isc/xml.h \
include/isc/work.h
libisc_la_SOURCES = \
@@ -210,6 +211,7 @@ libisc_la_SOURCES = \
url.c \
utf8.c \
uv.c \
xml.c \
work.c
libisc_la_CPPFLAGS = \

25
lib/isc/include/isc/xml.h Normal file
View File

@@ -0,0 +1,25 @@
/*
* 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.
*/
#pragma once
#include <stdbool.h>
void
isc__xml_initialize(void);
void
isc__xml_shutdown(void);
void
isc__xml_setdestroycheck(bool check);

View File

@@ -19,6 +19,7 @@
#include <isc/tls.h>
#include <isc/util.h>
#include <isc/uv.h>
#include <isc/xml.h>
#include "config.h"
#include "mem_p.h"
@@ -47,11 +48,13 @@ isc__initialize(void) {
isc__tls_initialize();
isc__trampoline_initialize();
isc__uv_initialize();
isc__xml_initialize();
(void)isc_os_ncpus();
}
void
isc__shutdown(void) {
isc__xml_shutdown();
isc__uv_shutdown();
isc__trampoline_shutdown();
isc__tls_shutdown();

79
lib/isc/xml.c Normal file
View File

@@ -0,0 +1,79 @@
/*
* 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
}