]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/strconv.cpp
SF patch #938489
[wxWidgets.git] / src / common / strconv.cpp
index 487b2204aa695beae10ecfac9654d39f650b65e7..9612c11ca9790012d75decc452d3ffb28472c2a9 100644 (file)
@@ -71,9 +71,9 @@
 #include "wx/fontmap.h"
 
 #ifdef __WXMAC__
-#include "ATSUnicode.h"
-#include "TextCommon.h"
-#include "TextEncodingConverter.h"
+#include <ATSUnicode.h>
+#include <TextCommon.h>
+#include <TextEncodingConverter.h>
 
 #include  "wx/mac/private.h"  // includes mac headers
 #endif
@@ -177,9 +177,11 @@ const wxWCharBuffer wxMBConv::cMB2WC(const char *psz) const
         {
             // now do the actual conversion
             wxWCharBuffer buf(nLen);
-            MB2WC(buf.data(), psz, nLen + 1); // with the trailing NUL
-
-            return buf;
+            nLen = MB2WC(buf.data(), psz, nLen + 1); // with the trailing NULL
+            if ( nLen != (size_t)-1 )
+            {
+                return buf;
+            }
         }
     }
 
@@ -196,9 +198,11 @@ const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *pwz) const
         if ( nLen != (size_t)-1 )
         {
             wxCharBuffer buf(nLen+3);       // space for a wxUint32 trailing zero
-            WC2MB(buf.data(), pwz, nLen + 4);
-
-            return buf;
+            nLen = WC2MB(buf.data(), pwz, nLen + 4);
+            if ( nLen != (size_t)-1 )
+            {
+                return buf;
+            }
         }
     }
 
@@ -1331,13 +1335,16 @@ public:
                }
            ByteCount byteBufferLen = n * sizeof( UniChar ) ; 
 #if SIZEOF_WCHAR_T == 4
-               ubuf = (UniChar*) malloc( byteBufferLen ) ;
+               ubuf = (UniChar*) malloc( byteBufferLen + 2 ) ;
 #else
                ubuf = (UniChar*) (buf ? buf : tbuf) ;
 #endif
            status = TECConvertText(m_MB2WC_converter, (ConstTextPtr) psz , byteInLen, &byteInLen,
              (TextPtr) ubuf , byteBufferLen, &byteOutLen);
 #if SIZEOF_WCHAR_T == 4
+        // we have to terminate here, because n might be larger for the trailing zero, and if UniChar
+        // is not properly terminated we get random characters at the end
+        ubuf[byteOutLen / sizeof( UniChar ) ] = 0 ;
                wxMBConvUTF16BE converter ;
                res = converter.MB2WC( (buf ? buf : tbuf) , (const char*)ubuf , n ) ;
                free( ubuf ) ;
@@ -1373,9 +1380,9 @@ public:
 #if SIZEOF_WCHAR_T == 4
                wxMBConvUTF16BE converter ;
                size_t unicharlen = converter.WC2MB( NULL , psz , 0 ) ;
-               byteBufferLen = unicharlen ;
-               ubuf = (UniChar*) malloc( byteBufferLen + 2 ) ;
-               converter.WC2MB( (char*) ubuf , psz, unicharlen ) ;
+               byteInLen = unicharlen ;
+               ubuf = (UniChar*) malloc( byteInLen + 2 ) ;
+               converter.WC2MB( (char*) ubuf , psz, unicharlen + 2 ) ;
 #else
                ubuf = (UniChar*) psz ;
 #endif