Author: carnold
Date: Wed Jun 18 08:42:24 2008
New Revision: 669204
URL: http://svn.apache.org/viewvc?rev=669204&view=rev
Log:
Escape sequences not recognized in property files
Modified:
logging/log4cxx/trunk/src/changes/changes.xml
logging/log4cxx/trunk/src/main/cpp/properties.cpp
logging/log4cxx/trunk/src/test/cpp/helpers/propertiestestcase.cpp
logging/log4cxx/trunk/src/test/resources/input/propertiestestcase.properties
Modified: logging/log4cxx/trunk/src/changes/changes.xml
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/changes/changes.xml?rev=669204&r1=669203&r2=669204&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/changes/changes.xml (original)
+++ logging/log4cxx/trunk/src/changes/changes.xml Wed Jun 18 08:42:24 2008
@@ -43,6 +43,7 @@
<action issue="LOGCXX-288">Unnecessary trailing semi-colons after LOG4CXX_INFO
et al in docs, examples and tests.<action>
<action issue="LOGCXX-291">Tab characters are not recognized in property
files.<action>
<action issue="LOGCXX-292">Value continuation does not properly handle CRLF in
property files.<action>
+<action issue="LOGCXX-293">Escape sequences not recognized in property
files.<action>
</release>
<release version="0.10.0" date="2008-04-03" description="First Apache release">
<action issue="LOGCXX-2">logger.h includes config.h</action>
Modified: logging/log4cxx/trunk/src/main/cpp/properties.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/properties.cpp?rev=669204&r1=669203&r2=669204&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/properties.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/properties.cpp Wed Jun 18 08:42:24 2008
@@ -106,28 +106,35 @@
case KEY_ESCAPE:
switch(c)
{
- case 0x09: // '\t'
- case 0x20: // ' '
- case 0x3A: // ':'
- case 0x3D: // '='
- case 0x5C: // '\\'
- key.append(1, c);
+ case 0x74: // 't'
+ key.append(1, 0x09);
+ lexemType = KEY;
+ break;
+
+ case 0x6E: // 'n'
+ key.append(1, 0x0A);
lexemType = KEY;
- if (!get(in, c))
- finished = true;
break;
+ case 0x72: // 'r'
+ key.append(1, 0x0D);
+ lexemType = KEY;
+ break;
+
case 0x0A: // '\n'
lexemType = KEY_CONTINUE;
- if (!get(in, c))
- finished = true;
break;
case 0x0D: // '\r'
lexemType = KEY_CONTINUE2;
- if (!get(in, c))
- finished = true;
break;
+
+ default:
+ key.append(1, c);
+ lexemType = KEY;
+ }
+ if (!get(in, c)) {
+ finished = true;
}
break;
@@ -209,32 +216,35 @@
case ELEMENT_ESCAPE:
switch(c)
{
- case 0x09: // '\t'
- case 0x20: // ' '
+ case 0x74: // 't'
+ element.append(1, 0x09);
+ lexemType = ELEMENT;
+ break;
+
case 0x6E: // 'n'
+ element.append(1, 0x0A);
+ lexemType = ELEMENT;
+ break;
+
case 0x72: // 'r'
- case 0x27: // '\''
- case 0x5C: // '\\'
- case 0x22: // '\"'
- case 0x3A: // ':'
- default:
- element.append(1, c);
+ element.append(1, 0x0D);
lexemType = ELEMENT;
- if (!get(in, c))
- finished = true;
break;
case 0x0A: // '\n'
lexemType = ELEMENT_CONTINUE;
- if (!get(in, c))
- finished = true;
break;
case 0x0D: // '\r'
lexemType = ELEMENT_CONTINUE2;
- if (!get(in, c))
- finished = true;
break;
+ default:
+ element.append(1, c);
+ lexemType = ELEMENT;
+ break;
+ }
+ if (!get(in, c)) {
+ finished = true;
}
break;
@@ -329,7 +339,6 @@
{
LogString oldValue((*properties)[key]);
(*properties)[key] = value;
- //tcout << ASCII_STR("setting property key=") << key << ASCII_STR(",
value=") << value << std::endl;
return oldValue;
}
Modified: logging/log4cxx/trunk/src/test/cpp/helpers/propertiestestcase.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/test/cpp/helpers/propertiestestcase.cpp?rev=669204&r1=669203&r2=669204&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/test/cpp/helpers/propertiestestcase.cpp (original)
+++ logging/log4cxx/trunk/src/test/cpp/helpers/propertiestestcase.cpp Wed Jun
18 08:42:24 2008
@@ -36,6 +36,12 @@
LOGUNIT_TEST(testTab6);
LOGUNIT_TEST(testTab7);
LOGUNIT_TEST(testCRLF1);
+ LOGUNIT_TEST(testEscT1);
+ LOGUNIT_TEST(testEscT2);
+ LOGUNIT_TEST(testEscN1);
+ LOGUNIT_TEST(testEscN2);
+ LOGUNIT_TEST(testEscR1);
+ LOGUNIT_TEST(testEscR2);
LOGUNIT_TEST_SUITE_END();
public:
@@ -139,7 +145,7 @@
}
/**
- * Test tab in value continuation, see LOGCXX-291.
+ * Test tab in value continuation, see LOGCXX-292.
*/
void testCRLF1() {
FileInputStreamPtr propFile(
@@ -150,6 +156,97 @@
LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("continuedvalue")),
actual);
}
+ /**
+ * Test tab as escaped within key, see LOGCXX-293.
+ */
+ void testEscT1() {
+ FileInputStreamPtr propFile(
+ new
FileInputStream(LOG4CXX_STR("input/propertiestestcase.properties")));
+ Properties properties;
+ properties.load(propFile);
+ LogString key(LOG4CXX_STR("propertiestestcase.esct1"));
+ key.append(1, 0x09);
+ LogString actual(properties.getProperty(key));
+ LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("key contains tab")), actual);
+ }
+
+
+
+ /**
+ * Test tab escaped in value, see LOGCXX-293.
+ */
+ void testEscT2() {
+ FileInputStreamPtr propFile(
+ new
FileInputStream(LOG4CXX_STR("input/propertiestestcase.properties")));
+ Properties properties;
+ properties.load(propFile);
+ LogString
actual(properties.getProperty(LOG4CXX_STR("propertiestestcase.esct2")));
+ LogString expected(1, 0x09);
+ expected.append(LOG4CXX_STR(" in value"));
+ LOGUNIT_ASSERT_EQUAL(expected, actual);
+ }
+
+ /**
+ * Test \n within key, see LOGCXX-293.
+ */
+ void testEscN1() {
+ FileInputStreamPtr propFile(
+ new
FileInputStream(LOG4CXX_STR("input/propertiestestcase.properties")));
+ Properties properties;;
+ properties.load(propFile);
+ LogString key(LOG4CXX_STR("propertiestestcase.escn1"));
+ key.append(1, 0x0A);
+ LogString actual(properties.getProperty(key));
+ LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("key contains lf")), actual);
+ }
+
+
+
+ /**
+ * Test \n in value, see LOGCXX-293.
+ */
+ void testEscN2() {
+ FileInputStreamPtr propFile(
+ new
FileInputStream(LOG4CXX_STR("input/propertiestestcase.properties")));
+ Properties properties;
+ properties.load(propFile);
+ LogString
actual(properties.getProperty(LOG4CXX_STR("propertiestestcase.escn2")));
+ LogString expected(1, 0x0A);
+ expected.append(LOG4CXX_STR(" in value"));
+ LOGUNIT_ASSERT_EQUAL(expected, actual);
+ }
+
+ /**
+ * Test \r within key, see LOGCXX-293.
+ */
+ void testEscR1() {
+ FileInputStreamPtr propFile(
+ new
FileInputStream(LOG4CXX_STR("input/propertiestestcase.properties")));
+ Properties properties;
+ properties.load(propFile);
+ LogString key(LOG4CXX_STR("propertiestestcase.escr1"));
+ key.append(1, 0x0D);
+ LogString actual(properties.getProperty(key));
+ LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("key contains cr")), actual);
+ }
+
+
+
+ /**
+ * Test \r in value, see LOGCXX-293.
+ */
+ void testEscR2() {
+ FileInputStreamPtr propFile(
+ new
FileInputStream(LOG4CXX_STR("input/propertiestestcase.properties")));
+ Properties properties;
+ properties.load(propFile);
+ LogString
actual(properties.getProperty(LOG4CXX_STR("propertiestestcase.escr2")));
+ LogString expected(1, 0x0D);
+ expected.append(LOG4CXX_STR(" in value"));
+ LOGUNIT_ASSERT_EQUAL(expected, actual);
+ }
+
+
};
Modified:
logging/log4cxx/trunk/src/test/resources/input/propertiestestcase.properties
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/test/resources/input/propertiestestcase.properties?rev=669204&r1=669203&r2=669204&view=diff
==============================================================================
---
logging/log4cxx/trunk/src/test/resources/input/propertiestestcase.properties
(original)
+++
logging/log4cxx/trunk/src/test/resources/input/propertiestestcase.properties
Wed Jun 18 08:42:24 2008
@@ -24,3 +24,9 @@
value
propertiestestcase.crlf1=continued\
value
+propertiestestcase.esct1\t=key contains tab
+propertiestestcase.esct2=\t in value
+propertiestestcase.escn1\n=key contains lf
+propertiestestcase.escn2=\n in value
+propertiestestcase.escr1\r=key contains cr
+propertiestestcase.escr2=\r in value