This is an automated email from the ASF dual-hosted git repository.
swebb2066 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 d2543343 Reject undersized SyslogAppender MaxMessageLength values
(#657)
d2543343 is described below
commit d25433436ca5294effce4beb3fa4d0ce263aca59
Author: metsw24-max <[email protected]>
AuthorDate: Sun May 10 11:46:15 2026 +0530
Reject undersized SyslogAppender MaxMessageLength values (#657)
The append() splitting loop computes chunk-end iterators as
start + maxMessageLength - 12 to reserve space for an "(x/y)" sequence
suffix. With maxMessageLength == 12 the chunk size is zero and the loop
never advances, growing the packets vector indefinitely. Smaller
positive values walk the iterator before msg.begin() before constructing
LogString(start, end) with start > end (undefined behaviour).
Validate the value in setMaxMessageLength so the public setter and the
setOption("MaxMessageLength", ...) configuration path both fall back to
the documented default when the configured value cannot satisfy the
suffix-reservation arithmetic.
---
src/main/cpp/syslogappender.cpp | 9 ++++++++
src/test/cpp/net/syslogappendertestcase.cpp | 32 +++++++++++++++++++++++++++++
2 files changed, 41 insertions(+)
diff --git a/src/main/cpp/syslogappender.cpp b/src/main/cpp/syslogappender.cpp
index 573f3786..ea9bd450 100644
--- a/src/main/cpp/syslogappender.cpp
+++ b/src/main/cpp/syslogappender.cpp
@@ -477,6 +477,15 @@ bool SyslogAppender::getFacilityPrinting() const
void SyslogAppender::setMaxMessageLength(int maxMessageLength1)
{
+ // append() reserves 12 characters per chunk for an "(x/y)" sequence
suffix.
+ // A value at or below the suffix size produces a zero-length chunk
(causing
+ // an infinite split loop) or an iterator computed before msg.begin()
(UB).
+ static const int MIN_MAX_MESSAGE_LENGTH = 13;
+ if (maxMessageLength1 < MIN_MAX_MESSAGE_LENGTH)
+ {
+ LogLog::warn(LOG4CXX_STR("SyslogAppender MaxMessageLength is
too small. Using the default value."));
+ maxMessageLength1 = 1024;
+ }
_priv->maxMessageLength = maxMessageLength1;
}
diff --git a/src/test/cpp/net/syslogappendertestcase.cpp
b/src/test/cpp/net/syslogappendertestcase.cpp
index 8470548f..697055f6 100644
--- a/src/test/cpp/net/syslogappendertestcase.cpp
+++ b/src/test/cpp/net/syslogappendertestcase.cpp
@@ -33,6 +33,10 @@ class SyslogAppenderTestCase : public
AppenderSkeletonTestCase
//
LOGUNIT_TEST(testDefaultThreshold);
LOGUNIT_TEST(testSetOptionThreshold);
+ LOGUNIT_TEST(testSetMaxMessageLengthBelowSuffixSizeFallsBack);
+ LOGUNIT_TEST(testSetMaxMessageLengthNegativeFallsBack);
+
LOGUNIT_TEST(testMaxMessageLengthOptionBelowSuffixSizeFallsBack);
+ LOGUNIT_TEST(testMaxMessageLengthOptionValid);
LOGUNIT_TEST_SUITE_END();
@@ -43,6 +47,34 @@ class SyslogAppenderTestCase : public
AppenderSkeletonTestCase
{
return new log4cxx::net::SyslogAppender();
}
+
+ void testSetMaxMessageLengthBelowSuffixSizeFallsBack()
+ {
+ log4cxx::net::SyslogAppender appender;
+ appender.setMaxMessageLength(12);
+ LOGUNIT_ASSERT(appender.getMaxMessageLength() >= 13);
+ }
+
+ void testSetMaxMessageLengthNegativeFallsBack()
+ {
+ log4cxx::net::SyslogAppender appender;
+ appender.setMaxMessageLength(-100);
+ LOGUNIT_ASSERT(appender.getMaxMessageLength() >= 13);
+ }
+
+ void testMaxMessageLengthOptionBelowSuffixSizeFallsBack()
+ {
+ log4cxx::net::SyslogAppender appender;
+ appender.setOption(LOG4CXX_STR("MAXMESSAGELENGTH"),
LOG4CXX_STR("5"));
+ LOGUNIT_ASSERT(appender.getMaxMessageLength() >= 13);
+ }
+
+ void testMaxMessageLengthOptionValid()
+ {
+ log4cxx::net::SyslogAppender appender;
+ appender.setOption(LOG4CXX_STR("MAXMESSAGELENGTH"),
LOG4CXX_STR("2048"));
+ LOGUNIT_ASSERT_EQUAL(2048,
appender.getMaxMessageLength());
+ }
};
LOGUNIT_TEST_SUITE_REGISTRATION(SyslogAppenderTestCase);