Details
-
Bug
-
Resolution: Duplicate
-
Major
-
None
-
1.1.2
-
None
-
All
Description
When logback attempts to substitute values in for variables (of of the style ${...}) in the body of an element in logback.xml, if the body String ends with a dollar sign, '$', line 63 of ch.qos.logback.core.subst.Tokenizer performs:
throw new ScanException("Unexpected end of pattern string");
Which incorrectly throws a ScanException, because it is incorrectly expecting more characters, either a '{' to tell it to expect a variable name, or not a '{', to indicate that the '$' was a literal. If a '$' is the last character, obviously it is a literal instead of the beginning of a variable reference token.
Also, if the body String ends with "${", an NPE is thrown by some other method. Instead, my solution below throws a ScanException in this case (plus for the case where a "${" is not closed by a "}").
Lastly, if the String includes unbalanced '
{' without corresponding closing '}', your code throws exceptions elsewhere. Why must '
{' be balanced by closing '}', if the '{' is not preceded by a '$'? My solution doesn't fix this issue, only the previous issues. Assuming my solution works for the earlier issues, however, it should be put into place, and the latter '{' issue can be handled later.
Solution (not tested or even compiled, so it might contain typos):
The body of the switch statement that include line 63 should probably be replaced with something like the following:
case LITERAL_STATE:
final int tokenCount = tokenList.size();
if (tokenCount >= 2 && tokenList.get(tokenCount - 2) == Token.START_TOKEN) {
throw new ScanException("variable reference open, \"${\", without a variable reference close, \"}\" for variable name " + buf);
}
addLiteralToken(tokenList, buf);
break;
case START_STATE:
buf.append(CoreConstants.DOLLAR);
addLiteralToken(tokenList, buf);
break;
Attachments
Issue Links
- duplicates
-
LOGBACK-1149 IllegalArgumentException when using $ in logger name
- Closed