Fixed incorrect use of FX_WSTRC on FX_WCHAR* vars.
authorBruce Dawson <brucedawson@google.com>
Mon, 5 Jan 2015 18:06:47 +0000 (10:06 -0800)
committerBruce Dawson <brucedawson@google.com>
Mon, 5 Jan 2015 18:06:47 +0000 (10:06 -0800)
FX_WSTRC is only valid on arrays, not pointers. In five places it was
being passed a pointer, which leads to incorrect string objects being
created. This was found when integrating a change to FX_WSTRC that
disallows pointer arguments.

The consequence of this bug is that five XML strings (quot, amp,
apos, lt, and gt) will all end up with incorrect lengths. They
will all be one character long in 32-bit builds, and three characters
long in 64-bit builds (sizeof(WCHAR*)-1).

Also removed some unneeded casts and marked some arrays as const.

Fixing this is necessary in order to allow landing of
https://codereview.chromium.org/818193004/

Testing this was attempted by using the xfa branch of pdfium in
Chrome:
cd  third_party\pdfium
git checkout xfa

However even without these changes this caused a CHECK failure in
V8::InitializePlatform due to double initialization, so the fix
has not been tested, but is clearly an improvement.

BUG= https://code.google.com/p/pdfium/issues/detail?id=96
R=bo_xu@foxitsoftware.com

Review URL: https://codereview.chromium.org/826573003

xfa/src/fxfa/src/fm2js/xfa_fm2jscontext.cpp

index 3f44b5d..330bfcf 100644 (file)
@@ -3861,12 +3861,12 @@ void CXFA_FM2JSContext::DecodeXML (FX_BSTR szXMLString,  CFX_ByteTextBuf &szResu
             ++i;\r
             continue;\r
         }\r
-        FX_WCHAR *strName[] = {\r
-            (FX_WCHAR *)L"quot",\r
-            (FX_WCHAR *)L"amp",\r
-            (FX_WCHAR *)L"apos",\r
-            (FX_WCHAR *)L"lt",\r
-            (FX_WCHAR *)L"gt"\r
+        FX_LPCWSTR const strName[] = {\r
+            L"quot",\r
+            L"amp",\r
+            L"apos",\r
+            L"lt",\r
+            L"gt"\r
         };\r
         FX_INT32 iIndex = 0;\r
         while (iIndex < 5) {\r
@@ -3958,7 +3958,7 @@ void CXFA_FM2JSContext::EncodeURL (FX_BSTR szURLString,  CFX_ByteTextBuf &szResu
     FX_WCHAR strUnsafe[] = { ' ', '<', '>', '"', '#', '%', '{', '}', '|', '\\', '^', '~', '[', ']', '`' };\r
     FX_WCHAR strReserved[] = {';', '/', '?', ':', '@', '=', '&'};\r
     FX_WCHAR strSpecial[] = {'$', '-', '+', '!', '*', '\'', '(', ')', ','};\r
-    FX_WCHAR* strCode = (FX_WCHAR *)L"0123456789abcdef";\r
+    FX_WCHAR* strCode = L"0123456789abcdef";\r
     for (FX_INT32 u = 0; u < iLength; ++u) {\r
         ch = wsURLString.GetAt(u);\r
         FX_INT32 i = 0;\r
@@ -4121,14 +4121,14 @@ void CXFA_FM2JSContext::EncodeXML (FX_BSTR szXMLString,  CFX_ByteTextBuf &szResu
     strEncode[6] = 0;\r
     strEncode[7] = ';';\r
     strEncode[8] = 0;\r
-    FX_WCHAR *strName[] = {\r
-        (FX_WCHAR *)L"quot",\r
-        (FX_WCHAR *)L"amp",\r
-        (FX_WCHAR *)L"apos",\r
-        (FX_WCHAR *)L"lt",\r
-        (FX_WCHAR *)L"gt"\r
+    FX_LPCWSTR const strName[] = {\r
+        L"quot",\r
+        L"amp",\r
+        L"apos",\r
+        L"lt",\r
+        L"gt"\r
     };\r
-    FX_WCHAR* strCode = (FX_WCHAR *)L"0123456789abcdef";\r
+    FX_WCHAR* strCode = L"0123456789abcdef";\r
     FX_WCHAR ch = 0;\r
     FX_INT32 iLength = wsXMLString.GetLength();\r
     FX_INT32 iIndex = 0;\r
@@ -4139,27 +4139,27 @@ void CXFA_FM2JSContext::EncodeXML (FX_BSTR szXMLString,  CFX_ByteTextBuf &szResu
         switch (ch) {\r
             case '"':\r
                 wsResultBuf.AppendChar('&');\r
-                wsResultBuf << FX_WSTRC(strName[QUOT]);\r
+                wsResultBuf << CFX_WideStringC(strName[QUOT]);\r
                 wsResultBuf.AppendChar(';');\r
                 break;\r
             case '&':\r
                 wsResultBuf.AppendChar('&');\r
-                wsResultBuf << FX_WSTRC(strName[AMP]);\r
+                wsResultBuf << CFX_WideStringC(strName[AMP]);\r
                 wsResultBuf.AppendChar(';');\r
                 break;\r
             case  '\'':\r
                 wsResultBuf.AppendChar('&');\r
-                wsResultBuf << FX_WSTRC(strName[APOS]);\r
+                wsResultBuf << CFX_WideStringC(strName[APOS]);\r
                 wsResultBuf.AppendChar(';');\r
                 break;\r
             case  '<':\r
                 wsResultBuf.AppendChar('&');\r
-                wsResultBuf << FX_WSTRC(strName[LT]);\r
+                wsResultBuf << CFX_WideStringC(strName[LT]);\r
                 wsResultBuf.AppendChar(';');\r
                 break;\r
             case '>':\r
                 wsResultBuf.AppendChar('&');\r
-                wsResultBuf << FX_WSTRC(strName[GT]);\r
+                wsResultBuf << CFX_WideStringC(strName[GT]);\r
                 wsResultBuf.AppendChar(';');\r
                 break;\r
             default: {\r