Thies Wellpott created LOG4J2-1216:
--------------------------------------

             Summary: Nested pattern layout options broken
                 Key: LOG4J2-1216
                 URL: https://issues.apache.org/jira/browse/LOG4J2-1216
             Project: Log4j 2
          Issue Type: Bug
          Components: Pattern Converters
    Affects Versions: 2.4.1
            Reporter: Thies Wellpott


Parsing the "deeply" nested PatternLayout
{code}
%maxLen{[XXX, ${hostName}, ${web:contextPath}] %p: %c{1} - %m%notEmpty{ 
=>%ex{short}}}{160}
{code}
(with %maxLen being a custom Converter)

results in wrong parsing.
Patternparser.extractOptions() gets the nesting wrong.

Solution:
{code}
private static int extractOptions(final String pattern, final int start, final 
List<String> options) {
    int i = start;
    while (i < pattern.length()  &&  pattern.charAt(i) == '{') {
        i++;                      // skip opening "{"
        final int begin = i;      // position of first real char
        int depth = 1;            // already inside one level
        while (depth > 0  &&  i < pattern.length()) {
            char c = pattern.charAt(i);
            if (c == '{') {
                depth++;
            } else if (c == '}') {
                depth--;
            // TODO(?) maybe escaping of { and } with \ or %
            }
            i++;
        } // while

        if (depth > 0) {          // option not closed, continue with pattern 
on opening "{"
            return begin-1;
        }

        options.add(pattern.substring(begin, i-1));
    } // while

    return i;
}
{code}
This should also be faster than the current implementation because the pattern 
ist only walked once, not multiple times with indexOf().

(LOG4J2-107 is a similar but old bug)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to