This is an automated email from the ASF dual-hosted git repository.
rmiddleton pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
The following commit(s) were added to refs/heads/master by this push:
new 323945bb Fix empty appender ref recursion (#472)
323945bb is described below
commit 323945bb7e2a9613baf8016886c7c53328ffdd4a
Author: Robert Middleton <[email protected]>
AuthorDate: Sun Feb 2 10:49:13 2025 -0500
Fix empty appender ref recursion (#472)
If an appender-ref tag is added with no ref, parsing the XML file gets stuck
in a recursive loop until the stack overflows. Check to make sure that the
ref attribute is in the XML file.
---
src/main/cpp/domconfigurator.cpp | 6 +++++-
src/test/cpp/xml/domtestcase.cpp | 8 ++++++++
src/test/resources/input/xml/DOMConfiguratorRecursive.xml | 10 ++++++++++
3 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/src/main/cpp/domconfigurator.cpp b/src/main/cpp/domconfigurator.cpp
index 41141381..12648642 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<AppenderAttachable>(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 f5210ff5..5f98b29e 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 @@ public:
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 00000000..1ee21f7a
--- /dev/null
+++ b/src/test/resources/input/xml/DOMConfiguratorRecursive.xml
@@ -0,0 +1,10 @@
+<log4j:configuration xmlns:log4j=" ">
+ <appender class="AsyncAppender">
+ <appender-ref/>
+ </appender>
+
+ <logger>
+ <appender-ref/>
+ </logger>
+
+</log4j:configuration>