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