Index: xfa/fde/xml/fde_xml_imp.cpp |
diff --git a/xfa/fde/xml/fde_xml_imp.cpp b/xfa/fde/xml/fde_xml_imp.cpp |
index 4c6dcf989c4c910835c41ac17ea0adb58962ad9a..8e14f021ce3e15b68922ce6a28a036fc38835a03 100644 |
--- a/xfa/fde/xml/fde_xml_imp.cpp |
+++ b/xfa/fde/xml/fde_xml_imp.cpp |
@@ -14,6 +14,8 @@ |
namespace { |
+const uint32_t kMaxCharRange = 0x10ffff; |
+ |
const uint16_t g_XMLValidCharRange[][2] = {{0x09, 0x09}, |
{0x0A, 0x0A}, |
{0x0D, 0x0D}, |
@@ -1838,23 +1840,23 @@ FX_FILESIZE CFDE_XMLSyntaxParser::GetCurrentBinaryPos() const { |
return m_iParsedBytes + nDstLen; |
} |
-void CFDE_XMLSyntaxParser::ParseTextChar(FX_WCHAR ch) { |
+void CFDE_XMLSyntaxParser::ParseTextChar(FX_WCHAR character) { |
if (m_iIndexInBlock == m_iAllocStep) { |
m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
if (!m_pCurrentBlock) { |
return; |
} |
} |
- m_pCurrentBlock[m_iIndexInBlock++] = ch; |
+ m_pCurrentBlock[m_iIndexInBlock++] = character; |
m_iDataLength++; |
- if (m_iEntityStart > -1 && ch == L';') { |
+ if (m_iEntityStart > -1 && character == L';') { |
CFX_WideString csEntity; |
m_BlockBuffer.GetTextData(csEntity, m_iEntityStart + 1, |
(m_iDataLength - 1) - m_iEntityStart - 1); |
int32_t iLen = csEntity.GetLength(); |
if (iLen > 0) { |
if (csEntity[0] == L'#') { |
- ch = 0; |
+ uint32_t ch = 0; |
FX_WCHAR w; |
if (iLen > 1 && csEntity[1] == L'x') { |
for (int32_t i = 2; i < iLen; i++) { |
@@ -1872,14 +1874,17 @@ void CFDE_XMLSyntaxParser::ParseTextChar(FX_WCHAR ch) { |
} else { |
for (int32_t i = 1; i < iLen; i++) { |
w = csEntity[i]; |
- if (w < L'0' || w > L'9') { |
+ if (w < L'0' || w > L'9') |
break; |
- } |
ch = ch * 10 + w - L'0'; |
} |
} |
- if (ch != 0) { |
- m_BlockBuffer.SetTextChar(m_iEntityStart, ch); |
+ if (ch > kMaxCharRange) |
+ ch = ' '; |
+ |
+ character = static_cast<FX_WCHAR>(ch); |
+ if (character != 0) { |
+ m_BlockBuffer.SetTextChar(m_iEntityStart, character); |
m_iEntityStart++; |
} |
} else { |
@@ -1905,7 +1910,7 @@ void CFDE_XMLSyntaxParser::ParseTextChar(FX_WCHAR ch) { |
m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
m_iEntityStart = -1; |
} else { |
- if (m_iEntityStart < 0 && ch == L'&') { |
+ if (m_iEntityStart < 0 && character == L'&') { |
m_iEntityStart = m_iDataLength - 1; |
} |
} |