diff --git a/src/main/cpp/domconfigurator.cpp b/src/main/cpp/domconfigurator.cpp index 41141381f..126486425 100644 --- a/src/main/cpp/domconfigurator.cpp +++ b/src/main/cpp/domconfigurator.cpp @@ -299,7 +299,7 @@ AppenderPtr DOMConfigurator::parseAppender(Pool& p, { LogString refName = subst(getAttribute(utf8Decoder, currentElement, REF_ATTR)); - if (appender->instanceof(AppenderAttachable::getStaticClass())) + if (!refName.empty() && appender->instanceof(AppenderAttachable::getStaticClass())) { AppenderAttachablePtr aa = LOG4CXX_NS::cast(appender); if (LogLog::isDebugEnabled()) @@ -310,6 +310,10 @@ AppenderPtr DOMConfigurator::parseAppender(Pool& p, } aa->addAppender(findAppenderByReference(p, utf8Decoder, currentElement, doc, appenders)); } + else if (refName.empty()) + { + LogLog::error(LOG4CXX_STR("Can't add appender with empty ref attribute")); + } else { LogLog::error(LOG4CXX_STR("Requesting attachment of appender named [") + diff --git a/src/test/cpp/xml/domtestcase.cpp b/src/test/cpp/xml/domtestcase.cpp index f5210ff5f..5f98b29e5 100644 --- a/src/test/cpp/xml/domtestcase.cpp +++ b/src/test/cpp/xml/domtestcase.cpp @@ -53,6 +53,7 @@ LOGUNIT_CLASS(DOMTestCase) #endif LOGUNIT_TEST(test3); LOGUNIT_TEST(test4); + LOGUNIT_TEST(recursiveAppenderRef); LOGUNIT_TEST(invalidAppender); LOGUNIT_TEST(invalidLevel); LOGUNIT_TEST_SUITE_END(); @@ -229,6 +230,13 @@ LOGUNIT_CLASS(DOMTestCase) LOGUNIT_ASSERT(exists); } + + void recursiveAppenderRef() + { + // Load a bad XML file, make sure that we don't crash in endless recursion + DOMConfigurator::configure(LOG4CXX_TEST_STR("input/xml/DOMConfiguratorRecursive.xml")); + } + void invalidAppender() { // Load an XML file that attempts to use a levelmatchfilter as an appender. diff --git a/src/test/resources/input/xml/DOMConfiguratorRecursive.xml b/src/test/resources/input/xml/DOMConfiguratorRecursive.xml new file mode 100644 index 000000000..1ee21f7a9 --- /dev/null +++ b/src/test/resources/input/xml/DOMConfiguratorRecursive.xml @@ -0,0 +1,10 @@ + + + + + + + + + +