mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-22 10:10:06 +00:00
Move xmlInitThreads()/xmlCleanupThreads() calls
xmlInitThreads() and xmlCleanupThreads() are called from within named_statschannels_configure() and named_statschannels_shutdown(), respectively. Both of these functions are executed by worker threads, not the main named thread. This causes ASAN to report memory leaks like the following one upon shutdown (as long as named is asked to produce any XML output over its configured statistics channels during its lifetime): Direct leak of 968 byte(s) in 1 object(s) allocated from: #0 0x7f677c249cd8 in __interceptor_calloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cc:153 #1 0x7f677bc1838f in xmlGetGlobalState (/usr/lib/libxml2.so.2+0xa838f) The data mentioned in the above report is a libxml2 state structure stored as thread-specific data. Such chunks of memory are automatically released (by a destructor passed to pthread_key_create() by libxml2) whenever a thread that allocated a given chunk exits. However, if xmlCleanupThreads() is called by a given thread before it exits, the destructor will not be invoked (due to xmlCleanupThreads() calling pthread_key_delete()) and ASAN will report a memory leak. Thus, xmlInitThreads() and xmlCleanupThreads() must not be called from worker threads. Since xmlInitThreads() must be called on Windows in order for libxml2 to work at all, move xmlInitThreads() and xmlCleanupThreads() calls to the main named thread (which does not produce any XML output itself) in order to prevent the memory leak from being reported by ASAN.
This commit is contained in:
parent
3f96af1ae6
commit
b425b5d56e
@ -1443,6 +1443,10 @@ main(int argc, char *argv[]) {
|
||||
setvbuf(stderr, NULL, _IOFBF, BUFSIZ);
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBXML2
|
||||
xmlInitThreads();
|
||||
#endif /* HAVE_LIBXML2 */
|
||||
|
||||
/*
|
||||
* Record version in core image.
|
||||
* strings named.core | grep "named version:"
|
||||
@ -1575,6 +1579,10 @@ main(int argc, char *argv[]) {
|
||||
|
||||
named_os_shutdown();
|
||||
|
||||
#ifdef HAVE_LIBXML2
|
||||
xmlCleanupThreads();
|
||||
#endif /* HAVE_LIBXML2 */
|
||||
|
||||
#ifdef HAVE_GPERFTOOLS_PROFILER
|
||||
ProfilerStop();
|
||||
#endif
|
||||
|
@ -3593,10 +3593,6 @@ named_statschannels_configure(named_server_t *server, const cfg_obj_t *config,
|
||||
|
||||
ISC_LIST_INIT(new_listeners);
|
||||
|
||||
#ifdef HAVE_LIBXML2
|
||||
xmlInitThreads();
|
||||
#endif /* HAVE_LIBXML2 */
|
||||
|
||||
/*
|
||||
* Get the list of named.conf 'statistics-channels' statements.
|
||||
*/
|
||||
@ -3729,10 +3725,6 @@ named_statschannels_shutdown(named_server_t *server) {
|
||||
ISC_LIST_UNLINK(server->statschannels, listener, link);
|
||||
shutdown_listener(listener);
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBXML2
|
||||
xmlCleanupThreads();
|
||||
#endif /* HAVE_LIBXML2 */
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
|
Loading…
x
Reference in New Issue
Block a user