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 1d7dda07 Restrict pattern layout min/max field width specifiers to 3 
digits (#475)
1d7dda07 is described below

commit 1d7dda076acff30aa34e3751d445e822be1d73a7
Author: Stephen Webb <[email protected]>
AuthorDate: Tue Feb 4 13:43:19 2025 +1100

    Restrict pattern layout min/max field width specifiers to 3 digits (#475)
---
 src/main/cpp/patternparser.cpp                 |  9 +++++++--
 src/main/include/log4cxx/patternlayout.h       |  4 ++--
 src/test/cpp/pattern/patternparsertestcase.cpp | 11 +++++++++++
 3 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/main/cpp/patternparser.cpp b/src/main/cpp/patternparser.cpp
index fe6c420f..d27ba07e 100644
--- a/src/main/cpp/patternparser.cpp
+++ b/src/main/cpp/patternparser.cpp
@@ -125,6 +125,7 @@ void PatternParser::parse(
        int state = LITERAL_STATE;
        logchar c;
        size_t i = 0;
+       int minDigitCount{ 0 }, maxDigitCount{ 0 };
        FormattingInfoPtr formattingInfo(FormattingInfo::getDefault());
 
        while (i < patternLength)
@@ -198,6 +199,7 @@ void PatternParser::parse(
                                                                                
formattingInfo->isLeftAligned(), c - 0x30 /* '0' */,
                                                                                
formattingInfo->getMaxLength());
                                                        state = MIN_STATE;
+                                                       minDigitCount = 1;
                                                }
                                                else
                                                {
@@ -221,12 +223,13 @@ void PatternParser::parse(
                        case MIN_STATE:
                                currentLiteral.append(1, c);
 
-                               if ((c >= 0x30 /* '0' */) && (c <= 0x39 /* '9' 
*/))
+                               if ((c >= 0x30 /* '0' */) && (c <= 0x39 /* '9' 
*/) && minDigitCount < 3)
                                {
                                        formattingInfo = 
std::make_shared<FormattingInfo>(
                                                                
formattingInfo->isLeftAligned(),
                                                                
(formattingInfo->getMinLength() * 10) + (c - 0x30 /* '0' */),
                                                                
formattingInfo->getMaxLength());
+                                       ++minDigitCount;
                                }
                                else if (c == 0x2E /* '.' */)
                                {
@@ -257,6 +260,7 @@ void PatternParser::parse(
                                                                
formattingInfo->isLeftAligned(), formattingInfo->getMinLength(),
                                                                c - 0x30 /* '0' 
*/);
                                        state = MAX_STATE;
+                                       maxDigitCount = 1;
                                }
                                else
                                {
@@ -270,11 +274,12 @@ void PatternParser::parse(
                        case MAX_STATE:
                                currentLiteral.append(1, c);
 
-                               if ((c >= 0x30 /* '0' */) && (c <= 0x39 /* '9' 
*/))
+                               if ((c >= 0x30 /* '0' */) && (c <= 0x39 /* '9' 
*/) && maxDigitCount < 3)
                                {
                                        formattingInfo = 
std::make_shared<FormattingInfo>(
                                                                
formattingInfo->isLeftAligned(), formattingInfo->getMinLength(),
                                                                
(formattingInfo->getMaxLength() * 10) + (c - 0x30 /* '0' */));
+                                       ++maxDigitCount;
                                }
                                else
                                {
diff --git a/src/main/include/log4cxx/patternlayout.h 
b/src/main/include/log4cxx/patternlayout.h
index c20242aa..7420266d 100644
--- a/src/main/include/log4cxx/patternlayout.h
+++ b/src/main/include/log4cxx/patternlayout.h
@@ -283,7 +283,7 @@ LOG4CXX_LIST_DEF(FormattingInfoList, 
LOG4CXX_NS::pattern::FormattingInfoPtr);
  * <p>
  *  The first optional format modifier is the <em>left justification flag</em> 
which is
  *  just the minus (-) character. Then comes the optional <em>minimum field 
width</em>
- *  modifier. This is a decimal constant that represents the minimum number of 
characters
+ *  modifier. This is a 1 to 3 decimal digit constant that represents the 
minimum number of characters
  *  to output. If the data item requires fewer characters, it is padded on 
either the left
  *  or the right until the minimum width is reached. The default is to pad on 
the left
  *  (right justify) but you can specify right padding with the left 
justification flag. The
@@ -293,7 +293,7 @@ LOG4CXX_LIST_DEF(FormattingInfoList, 
LOG4CXX_NS::pattern::FormattingInfoPtr);
  *
  * <p>
  *  This behavior can be changed using the <em>maximum field width</em> 
modifier which is
- *  designated by a period followed by a decimal constant. If the data item is 
longer than
+ *  designated by a period followed by a 1 to 3 decimal digit constant. If the 
data item is longer than
  *  the maximum field, then the extra characters are removed from the 
<em>beginning</em> of
  *  the data item and not from the end. For example, it the maximum field 
width is eight
  *  and the data item is ten characters long, then the first two characters of 
the data
diff --git a/src/test/cpp/pattern/patternparsertestcase.cpp 
b/src/test/cpp/pattern/patternparsertestcase.cpp
index 746572da..88db4116 100644
--- a/src/test/cpp/pattern/patternparsertestcase.cpp
+++ b/src/test/cpp/pattern/patternparsertestcase.cpp
@@ -80,6 +80,7 @@ LOGUNIT_CLASS(PatternParserTestCase)
        LOGUNIT_TEST(testBasic2);
        LOGUNIT_TEST(testMultiOption);
        LOGUNIT_TEST(testThreadUsername);
+       LOGUNIT_TEST(testInvalidPatterns);
        LOGUNIT_TEST_SUITE_END();
 
        LoggingEventPtr event;
@@ -293,6 +294,16 @@ public:
                        expected);
        }
 
+       void testInvalidPatterns()
+       {
+               assertFormattedEquals(LOG4CXX_STR("%6666c"),
+                       getFormatSpecifiers(),
+                       LOG4CXX_STR("%6666c"));
+               assertFormattedEquals(LOG4CXX_STR("%6.6666c"),
+                       getFormatSpecifiers(),
+                       LOG4CXX_STR("%6.6666c"));
+       }
+
 };
 
 //

Reply via email to