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);

Reply via email to