Author: carnold
Date: Mon Dec 4 14:51:12 2006
New Revision: 482399
URL: http://svn.apache.org/viewvc?view=rev&rev=482399
Log:
LOGCXX-162: Problem printing string with embedded NULL character
Modified:
logging/log4cxx/trunk/src/charsetdecoder.cpp
logging/log4cxx/trunk/tests/src/helpers/charsetdecodertestcase.cpp
Modified: logging/log4cxx/trunk/src/charsetdecoder.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/charsetdecoder.cpp?view=diff&rev=482399&r1=482398&r2=482399
==============================================================================
--- logging/log4cxx/trunk/src/charsetdecoder.cpp (original)
+++ logging/log4cxx/trunk/src/charsetdecoder.cpp Mon Dec 4 14:51:12 2006
@@ -181,17 +181,22 @@
memset(buf, 0, BUFSIZE*sizeof(wchar_t));
const char* src = in.current();
- size_t converted = mbsrtowcs(buf,
- &src,
- requested,
- &mbstate);
- if (converted == (size_t) -1) {
- stat = APR_BADARG;
- in.position(src - in.data());
- break;
+ if(*src == 0) {
+ out.append(1, 0);
+ in.position(in.position() + 1);
} else {
- stat = append(out, buf);
- in.position(in.position() + converted);
+ size_t converted = mbsrtowcs(buf,
+ &src,
+ requested,
+ &mbstate);
+ if (converted == (size_t) -1) {
+ stat = APR_BADARG;
+ in.position(src - in.data());
+ break;
+ } else {
+ stat = append(out, buf);
+ in.position(in.position() + converted);
+ }
}
}
return stat;
Modified: logging/log4cxx/trunk/tests/src/helpers/charsetdecodertestcase.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/tests/src/helpers/charsetdecodertestcase.cpp?view=diff&rev=482399&r1=482398&r2=482399
==============================================================================
--- logging/log4cxx/trunk/tests/src/helpers/charsetdecodertestcase.cpp
(original)
+++ logging/log4cxx/trunk/tests/src/helpers/charsetdecodertestcase.cpp Mon Dec
4 14:51:12 2006
@@ -39,6 +39,7 @@
CPPUNIT_TEST(decode6);
CPPUNIT_TEST(decode7);
#endif
+ CPPUNIT_TEST(decode8);
CPPUNIT_TEST_SUITE_END();
enum { BUFSIZE = 256 };
@@ -169,6 +170,24 @@
}
#endif
+
+ void decode8() {
+ char buf[] = { 'H', 'e', 'l', 'l', 'o', ',', 0, 'W', 'o', 'r', 'l',
'd'};
+ ByteBuffer src(buf, 12);
+
+ CharsetDecoderPtr dec(CharsetDecoder::getDefaultDecoder());
+ LogString greeting;
+ log4cxx_status_t stat = dec->decode(src, greeting);
+ CPPUNIT_ASSERT_EQUAL(APR_SUCCESS, stat);
+
+ stat = dec->decode(src, greeting);
+ CPPUNIT_ASSERT_EQUAL(APR_SUCCESS, stat);
+ CPPUNIT_ASSERT_EQUAL((size_t) 12, src.position());
+
+ LogString expected(LOG4CXX_STR("Hello,\0World"), 12);
+ CPPUNIT_ASSERT_EQUAL(expected, greeting);
+ }
+
};