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 4ecfbcd2 Normalize invalid FileAppender buffer sizes (#656)
4ecfbcd2 is described below

commit 4ecfbcd24530956530fbf56ab720c89f4eee90e9
Author: metsw24-max <[email protected]>
AuthorDate: Mon May 11 07:30:57 2026 +0530

    Normalize invalid FileAppender buffer sizes (#656)
---
 src/main/cpp/fileappender.cpp         | 17 +++++++++++++++--
 src/test/cpp/fileappendertestcase.cpp | 24 ++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/src/main/cpp/fileappender.cpp b/src/main/cpp/fileappender.cpp
index 32430c18..06c298dc 100644
--- a/src/main/cpp/fileappender.cpp
+++ b/src/main/cpp/fileappender.cpp
@@ -28,6 +28,7 @@
 #include "log4cxx/helpers/threadutility.h"
 #include <log4cxx/private/writerappender_priv.h>
 #include <log4cxx/private/fileappender_priv.h>
+#include <limits>
 #include <mutex>
 
 using namespace LOG4CXX_NS;
@@ -137,7 +138,13 @@ void FileAppender::setOption(const LogString& option,
        else if (StringHelper::equalsIgnoreCase(option, 
LOG4CXX_STR("BUFFERSIZE"), LOG4CXX_STR("buffersize")))
        {
                std::lock_guard<std::recursive_mutex> lock(_priv->mutex);
-               _priv->bufferSize = OptionConverter::toFileSize(value, 8 * 
1024);
+               long parsed = OptionConverter::toFileSize(value, 8 * 1024);
+               if (parsed < 0 || parsed > 
static_cast<long>((std::numeric_limits<int>::max)()))
+               {
+                       LogLog::warn(LOG4CXX_STR("FileAppender BufferSize is 
out of range. Using the default value."));
+                       parsed = 8 * 1024;
+               }
+               _priv->bufferSize = static_cast<int>(parsed);
        }
        else if (StringHelper::equalsIgnoreCase(option, 
LOG4CXX_STR("BUFFEREDSECONDS"), LOG4CXX_STR("bufferedseconds")))
        {
@@ -368,7 +375,8 @@ void FileAppender::setFileInternal(
        _priv->fileAppend = append1;
        _priv->bufferedIO = bufferedIO1;
        _priv->fileName = filename;
-       _priv->bufferSize = (int)bufferSize1;
+       const size_t intMax = 
static_cast<size_t>((std::numeric_limits<int>::max)());
+       _priv->bufferSize = static_cast<int>(bufferSize1 > intMax ? intMax : 
bufferSize1);
        _priv->writeHeader();
 
 }
@@ -395,6 +403,11 @@ int FileAppender::getBufferedSeconds() const
 
 void FileAppender::setBufferSize(int newValue)
 {
+       if (newValue < 0)
+       {
+               LogLog::warn(LOG4CXX_STR("FileAppender BufferSize must be 
non-negative. Using zero."));
+               newValue = 0;
+       }
        _priv->bufferSize = newValue;
 }
 
diff --git a/src/test/cpp/fileappendertestcase.cpp 
b/src/test/cpp/fileappendertestcase.cpp
index 61910e6e..c90981e4 100644
--- a/src/test/cpp/fileappendertestcase.cpp
+++ b/src/test/cpp/fileappendertestcase.cpp
@@ -43,6 +43,9 @@ class FileAppenderTestCase : public 
FileAppenderAbstractTestCase
                //  tests defined here
                LOGUNIT_TEST(testSetDoubleBackslashes);
                LOGUNIT_TEST(testStripDuplicateBackslashes);
+               LOGUNIT_TEST(testNegativeBufferSizeOptionFallsBack);
+               LOGUNIT_TEST(testOversizedBufferSizeOptionFallsBack);
+               LOGUNIT_TEST(testSetBufferSizeNormalizesNegativeValue);
 
                LOGUNIT_TEST_SUITE_END();
 
@@ -110,6 +113,27 @@ class FileAppenderTestCase : public 
FileAppenderAbstractTestCase
                                
FileAppender::stripDuplicateBackslashes(LOG4CXX_STR("\\\\\\\\foo.log")));
                }
 
+               void testNegativeBufferSizeOptionFallsBack()
+               {
+                       FileAppender appender;
+                       appender.setOption(LOG4CXX_STR("BUFFERSIZE"), 
LOG4CXX_STR("-1"));
+                       LOGUNIT_ASSERT(appender.getBufferSize() >= 0);
+               }
+
+               void testOversizedBufferSizeOptionFallsBack()
+               {
+                       FileAppender appender;
+                       appender.setOption(LOG4CXX_STR("BUFFERSIZE"), 
LOG4CXX_STR("2G"));
+                       LOGUNIT_ASSERT(appender.getBufferSize() >= 0);
+               }
+
+               void testSetBufferSizeNormalizesNegativeValue()
+               {
+                       FileAppender appender;
+                       appender.setBufferSize(-100);
+                       LOGUNIT_ASSERT(appender.getBufferSize() >= 0);
+               }
+
 };
 
 LOGUNIT_TEST_SUITE_REGISTRATION(FileAppenderTestCase);

Reply via email to