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