]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use custom isc_mem based allocator for libxml2
authorOndřej Surý <ondrej@isc.org>
Fri, 23 Sep 2022 12:36:54 +0000 (14:36 +0200)
committerOndřej Surý <ondrej@isc.org>
Tue, 27 Sep 2022 15:10:42 +0000 (17:10 +0200)
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.

bin/named/main.c
lib/isc/Makefile.am
lib/isc/include/isc/xml.h [new file with mode: 0644]
lib/isc/lib.c
lib/isc/xml.c [new file with mode: 0644]

index 541564b98f706556fb4b12161b10d399c33cf09a..3eba68479d351802146e86dc0f4d7850510ddff4 100644 (file)
@@ -44,6 +44,7 @@
 #include <isc/timer.h>
 #include <isc/util.h>
 #include <isc/uv.h>
+#include <isc/xml.h>
 
 #include <dns/dispatch.h>
 #include <dns/dyndb.h>
@@ -1471,10 +1472,6 @@ main(int argc, char *argv[]) {
        (void)ProfilerStart(NULL);
 #endif /* ifdef HAVE_GPERFTOOLS_PROFILER */
 
-#ifdef HAVE_LIBXML2
-       xmlInitParser();
-#endif /* HAVE_LIBXML2 */
-
        /*
         * Technically, this call is superfluous because on startup of the main
         * program, the portable "C" locale is selected by default.  This
@@ -1593,10 +1590,6 @@ main(int argc, char *argv[]) {
 
        named_os_shutdown();
 
-#ifdef HAVE_LIBXML2
-       xmlCleanupParser();
-#endif /* HAVE_LIBXML2 */
-
 #ifdef HAVE_GPERFTOOLS_PROFILER
        ProfilerStop();
 #endif /* ifdef HAVE_GPERFTOOLS_PROFILER */
index 19a1600cbe606c194dee31277588fbdf042fcef5..8e1b71f98e90e81fd8c5795872fb454390056be6 100644 (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 =           \
diff --git a/lib/isc/include/isc/xml.h b/lib/isc/include/isc/xml.h
new file mode 100644 (file)
index 0000000..e4af801
--- /dev/null
@@ -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);
index a815f50ea45a74285d0fa2eaacdd7c43e47fc2bd..a04352622cf0571730f381139ba5215ae3d08a6b 100644 (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();
diff --git a/lib/isc/xml.c b/lib/isc/xml.c
new file mode 100644 (file)
index 0000000..e7fbb19
--- /dev/null
@@ -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
+}