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);
+        }
+
 
 
 };


Reply via email to