Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: xfa/fde/xml/fde_xml_imp.cpp

Issue 1842633004: Fix CData parsing in CFDE_XMLSyntaxParser. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Fix windows xfa Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/fde/xml/fde_xml_imp.h ('k') | xfa/fde/xml/fde_xml_imp_unittest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "xfa/fde/xml/fde_xml_imp.h" 7 #include "xfa/fde/xml/fde_xml_imp.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
(...skipping 1473 matching lines...) Expand 10 before | Expand all | Expand 10 after
1484 m_iBufferChars = 0; 1484 m_iBufferChars = 0;
1485 } 1485 }
1486 uint32_t CFDE_XMLSyntaxParser::DoSyntaxParse() { 1486 uint32_t CFDE_XMLSyntaxParser::DoSyntaxParse() {
1487 if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || 1487 if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error ||
1488 m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { 1488 m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) {
1489 return m_dwStatus; 1489 return m_dwStatus;
1490 } 1490 }
1491 FXSYS_assert(m_pStream && m_pBuffer && m_BlockBuffer.IsInitialized()); 1491 FXSYS_assert(m_pStream && m_pBuffer && m_BlockBuffer.IsInitialized());
1492 int32_t iStreamLength = m_pStream->GetLength(); 1492 int32_t iStreamLength = m_pStream->GetLength();
1493 int32_t iPos; 1493 int32_t iPos;
1494 FX_WCHAR ch; 1494
1495 uint32_t dwStatus = FDE_XMLSYNTAXSTATUS_None; 1495 uint32_t dwStatus = FDE_XMLSYNTAXSTATUS_None;
1496 while (TRUE) { 1496 while (TRUE) {
1497 if (m_pStart >= m_pEnd) { 1497 if (m_pStart >= m_pEnd) {
1498 if (m_bEOS || m_iCurrentPos >= iStreamLength) { 1498 if (m_bEOS || m_iCurrentPos >= iStreamLength) {
1499 m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS; 1499 m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS;
1500 return m_dwStatus; 1500 return m_dwStatus;
1501 } 1501 }
1502 m_iParsedChars += (m_pEnd - m_pBuffer); 1502 m_iParsedChars += (m_pEnd - m_pBuffer);
1503 m_iParsedBytes = m_iCurrentPos; 1503 m_iParsedBytes = m_iCurrentPos;
1504 if (m_pStream->GetPosition() != m_iCurrentPos) { 1504 if (m_pStream->GetPosition() != m_iCurrentPos) {
1505 m_pStream->Seek(FX_STREAMSEEK_Begin, m_iCurrentPos); 1505 m_pStream->Seek(FX_STREAMSEEK_Begin, m_iCurrentPos);
1506 } 1506 }
1507 m_iBufferChars = 1507 m_iBufferChars =
1508 m_pStream->ReadString(m_pBuffer, m_iXMLPlaneSize, m_bEOS); 1508 m_pStream->ReadString(m_pBuffer, m_iXMLPlaneSize, m_bEOS);
1509 iPos = m_pStream->GetPosition(); 1509 iPos = m_pStream->GetPosition();
1510 if (m_iBufferChars < 1) { 1510 if (m_iBufferChars < 1) {
1511 m_iCurrentPos = iStreamLength; 1511 m_iCurrentPos = iStreamLength;
1512 m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS; 1512 m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS;
1513 return m_dwStatus; 1513 return m_dwStatus;
1514 } 1514 }
1515 m_iCurrentPos = iPos; 1515 m_iCurrentPos = iPos;
1516 m_pStart = m_pBuffer; 1516 m_pStart = m_pBuffer;
1517 m_pEnd = m_pBuffer + m_iBufferChars; 1517 m_pEnd = m_pBuffer + m_iBufferChars;
1518 } 1518 }
1519
1519 while (m_pStart < m_pEnd) { 1520 while (m_pStart < m_pEnd) {
1520 ch = *m_pStart; 1521 FX_WCHAR ch = *m_pStart;
1521 switch (m_dwMode) { 1522 switch (m_dwMode) {
1522 case FDE_XMLSYNTAXMODE_Text: 1523 case FDE_XMLSYNTAXMODE_Text:
1523 if (ch == L'<') { 1524 if (ch == L'<') {
1524 if (m_iDataLength > 0) { 1525 if (m_iDataLength > 0) {
1525 m_iTextDataLength = m_iDataLength; 1526 m_iTextDataLength = m_iDataLength;
1526 m_BlockBuffer.Reset(); 1527 m_BlockBuffer.Reset();
1527 m_pCurrentBlock = 1528 m_pCurrentBlock =
1528 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); 1529 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
1529 m_iEntityStart = -1; 1530 m_iEntityStart = -1;
1530 dwStatus = FDE_XMLSYNTAXSTATUS_Text; 1531 dwStatus = FDE_XMLSYNTAXSTATUS_Text;
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
1776 if (!m_pCurrentBlock) { 1777 if (!m_pCurrentBlock) {
1777 return FDE_XMLSYNTAXSTATUS_Error; 1778 return FDE_XMLSYNTAXSTATUS_Error;
1778 } 1779 }
1779 } 1780 }
1780 m_pCurrentBlock[m_iIndexInBlock++] = ch; 1781 m_pCurrentBlock[m_iIndexInBlock++] = ch;
1781 m_iDataLength++; 1782 m_iDataLength++;
1782 } 1783 }
1783 m_pStart++; 1784 m_pStart++;
1784 break; 1785 break;
1785 case FDE_XMLSYNTAXMODE_SkipCommentOrDecl: 1786 case FDE_XMLSYNTAXMODE_SkipCommentOrDecl:
1786 if (ch == '-') { 1787 if (FX_wcsnicmp(m_pStart, L"--", 2) == 0) {
1788 m_pStart += 2;
1787 m_dwMode = FDE_XMLSYNTAXMODE_SkipComment; 1789 m_dwMode = FDE_XMLSYNTAXMODE_SkipComment;
1790 } else if (FX_wcsnicmp(m_pStart, L"[CDATA[", 7) == 0) {
1791 m_pStart += 7;
1792 m_dwMode = FDE_XMLSYNTAXMODE_SkipCData;
1788 } else { 1793 } else {
1789 m_dwMode = FDE_XMLSYNTAXMODE_SkipDeclNode; 1794 m_dwMode = FDE_XMLSYNTAXMODE_SkipDeclNode;
1790 m_SkipChar = L'>'; 1795 m_SkipChar = L'>';
1791 m_SkipStack.Push(L'>'); 1796 m_SkipStack.Push(L'>');
1792 } 1797 }
1793 break; 1798 break;
1799 case FDE_XMLSYNTAXMODE_SkipCData: {
1800 if (FX_wcsnicmp(m_pStart, L"]]>", 3) == 0) {
1801 m_pStart += 3;
1802 dwStatus = FDE_XMLSYNTAXSTATUS_CData;
1803 m_iTextDataLength = m_iDataLength;
1804 m_BlockBuffer.Reset();
1805 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
1806 m_dwMode = FDE_XMLSYNTAXMODE_Text;
1807 } else {
1808 if (m_iIndexInBlock == m_iAllocStep) {
1809 m_pCurrentBlock =
1810 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
1811 if (!m_pCurrentBlock)
1812 return FDE_XMLSYNTAXSTATUS_Error;
1813 }
1814 m_pCurrentBlock[m_iIndexInBlock++] = ch;
1815 m_iDataLength++;
1816 m_pStart++;
1817 }
1818 break;
1819 }
1794 case FDE_XMLSYNTAXMODE_SkipDeclNode: 1820 case FDE_XMLSYNTAXMODE_SkipDeclNode:
1795 if (m_SkipChar == L'\'' || m_SkipChar == L'\"') { 1821 if (m_SkipChar == L'\'' || m_SkipChar == L'\"') {
1796 m_pStart++; 1822 m_pStart++;
1797 if (ch != m_SkipChar) { 1823 if (ch != m_SkipChar)
1798 break; 1824 break;
1799 } 1825
1800 m_SkipStack.Pop(); 1826 m_SkipStack.Pop();
1801 uint32_t* pDWord = m_SkipStack.GetTopElement(); 1827 uint32_t* pDWord = m_SkipStack.GetTopElement();
1802 if (pDWord == NULL) { 1828 if (!pDWord)
1803 m_dwMode = FDE_XMLSYNTAXMODE_Text; 1829 m_dwMode = FDE_XMLSYNTAXMODE_Text;
1804 } else { 1830 else
1805 m_SkipChar = (FX_WCHAR)*pDWord; 1831 m_SkipChar = (FX_WCHAR)*pDWord;
1806 }
1807 } else { 1832 } else {
1808 switch (ch) { 1833 switch (ch) {
1809 case L'<': 1834 case L'<':
1810 m_SkipChar = L'>'; 1835 m_SkipChar = L'>';
1811 m_SkipStack.Push(L'>'); 1836 m_SkipStack.Push(L'>');
1812 break; 1837 break;
1813 case L'[': 1838 case L'[':
1814 m_SkipChar = L']'; 1839 m_SkipChar = L']';
1815 m_SkipStack.Push(L']'); 1840 m_SkipStack.Push(L']');
1816 break; 1841 break;
1817 case L'(': 1842 case L'(':
1818 m_SkipChar = L')'; 1843 m_SkipChar = L')';
1819 m_SkipStack.Push(L')'); 1844 m_SkipStack.Push(L')');
1820 break; 1845 break;
1821 case L'\'': 1846 case L'\'':
1822 m_SkipChar = L'\''; 1847 m_SkipChar = L'\'';
1823 m_SkipStack.Push(L'\''); 1848 m_SkipStack.Push(L'\'');
1824 break; 1849 break;
1825 case L'\"': 1850 case L'\"':
1826 m_SkipChar = L'\"'; 1851 m_SkipChar = L'\"';
1827 m_SkipStack.Push(L'\"'); 1852 m_SkipStack.Push(L'\"');
1828 break; 1853 break;
1829 default: 1854 default:
1830 if (ch == m_SkipChar) { 1855 if (ch == m_SkipChar) {
1831 m_SkipStack.Pop(); 1856 m_SkipStack.Pop();
1832 uint32_t* pDWord = m_SkipStack.GetTopElement(); 1857 uint32_t* pDWord = m_SkipStack.GetTopElement();
1833 if (pDWord == NULL) { 1858 if (!pDWord) {
1834 if (m_iDataLength >= 9) { 1859 if (m_iDataLength >= 9) {
1835 CFX_WideString wsHeader; 1860 CFX_WideString wsHeader;
1836 m_BlockBuffer.GetTextData(wsHeader, 0, 7); 1861 m_BlockBuffer.GetTextData(wsHeader, 0, 7);
1837 if (wsHeader.Equal(FX_WSTRC(L"[CDATA["))) {
1838 CFX_WideString wsTailer;
1839 m_BlockBuffer.GetTextData(wsTailer, m_iDataLength - 2,
1840 2);
1841 if (wsTailer.Equal(FX_WSTRC(L"]]"))) {
1842 m_BlockBuffer.DeleteTextChars(7, TRUE);
1843 m_BlockBuffer.DeleteTextChars(2, FALSE);
1844 dwStatus = FDE_XMLSYNTAXSTATUS_CData;
1845 }
1846 }
1847 } 1862 }
1848 m_iTextDataLength = m_iDataLength; 1863 m_iTextDataLength = m_iDataLength;
1849 m_BlockBuffer.Reset(); 1864 m_BlockBuffer.Reset();
1850 m_pCurrentBlock = 1865 m_pCurrentBlock =
1851 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); 1866 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
1852 m_dwMode = FDE_XMLSYNTAXMODE_Text; 1867 m_dwMode = FDE_XMLSYNTAXMODE_Text;
1853 } else { 1868 } else {
1854 m_SkipChar = (FX_WCHAR)*pDWord; 1869 m_SkipChar = static_cast<FX_WCHAR>(*pDWord);
1855 } 1870 }
1856 } 1871 }
1857 break; 1872 break;
1858 } 1873 }
1859 if (m_SkipStack.GetSize() > 0) { 1874 if (m_SkipStack.GetSize() > 0) {
1860 if (m_iIndexInBlock == m_iAllocStep) { 1875 if (m_iIndexInBlock == m_iAllocStep) {
1861 m_pCurrentBlock = 1876 m_pCurrentBlock =
1862 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); 1877 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
1863 if (!m_pCurrentBlock) { 1878 if (!m_pCurrentBlock) {
1864 return FDE_XMLSYNTAXSTATUS_Error; 1879 return FDE_XMLSYNTAXSTATUS_Error;
1865 } 1880 }
1866 } 1881 }
1867 m_pCurrentBlock[m_iIndexInBlock++] = ch; 1882 m_pCurrentBlock[m_iIndexInBlock++] = ch;
1868 m_iDataLength++; 1883 m_iDataLength++;
1869 } 1884 }
1870 m_pStart++; 1885 m_pStart++;
1871 } 1886 }
1872 break; 1887 break;
1873 case FDE_XMLSYNTAXMODE_SkipComment: 1888 case FDE_XMLSYNTAXMODE_SkipComment:
1874 if (ch == L'-') { 1889 if (FX_wcsnicmp(m_pStart, L"-->", 3) == 0) {
1875 if (m_iIndexInBlock == m_iAllocStep) { 1890 m_pStart += 2;
1876 m_pCurrentBlock = 1891 m_dwMode = FDE_XMLSYNTAXMODE_Text;
1877 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
1878 if (!m_pCurrentBlock) {
1879 return FDE_XMLSYNTAXSTATUS_Error;
1880 }
1881 }
1882 m_pCurrentBlock[m_iIndexInBlock++] = L'-';
1883 m_iDataLength++;
1884 } else if (ch == L'>') {
1885 if (m_iDataLength > 1) {
1886 m_BlockBuffer.Reset();
1887 m_pCurrentBlock =
1888 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
1889 m_dwMode = FDE_XMLSYNTAXMODE_Text;
1890 }
1891 } else {
1892 m_BlockBuffer.Reset();
1893 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
1894 } 1892 }
1893
1895 m_pStart++; 1894 m_pStart++;
1896 break; 1895 break;
1897 case FDE_XMLSYNTAXMODE_TargetData: 1896 case FDE_XMLSYNTAXMODE_TargetData:
1898 if (FDE_IsXMLWhiteSpace(ch)) { 1897 if (FDE_IsXMLWhiteSpace(ch)) {
1899 if (m_iDataLength < 1) { 1898 if (m_iDataLength < 1) {
1900 m_pStart++; 1899 m_pStart++;
1901 break; 1900 break;
1902 } else if (m_wQuotationMark == 0) { 1901 } else if (m_wQuotationMark == 0) {
1903 m_iTextDataLength = m_iDataLength; 1902 m_iTextDataLength = m_iDataLength;
1904 m_wQuotationMark = 0; 1903 m_wQuotationMark = 0;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1938 } 1937 }
1939 } 1938 }
1940 m_pCurrentBlock[m_iIndexInBlock++] = ch; 1939 m_pCurrentBlock[m_iIndexInBlock++] = ch;
1941 m_iDataLength++; 1940 m_iDataLength++;
1942 m_pStart++; 1941 m_pStart++;
1943 } 1942 }
1944 break; 1943 break;
1945 default: 1944 default:
1946 break; 1945 break;
1947 } 1946 }
1948 if (dwStatus != FDE_XMLSYNTAXSTATUS_None) { 1947 if (dwStatus != FDE_XMLSYNTAXSTATUS_None)
1949 return dwStatus; 1948 return dwStatus;
1950 }
1951 } 1949 }
1952 } 1950 }
1953 return 0; 1951 return 0;
1954 } 1952 }
1955 1953
1956 CFDE_XMLSyntaxParser::~CFDE_XMLSyntaxParser() { 1954 CFDE_XMLSyntaxParser::~CFDE_XMLSyntaxParser() {
1957 if (m_pCurrentBlock) { 1955 if (m_pCurrentBlock) {
1958 m_pCurrentBlock = NULL; 1956 m_pCurrentBlock = NULL;
1959 } 1957 }
1960 FX_Free(m_pBuffer); 1958 FX_Free(m_pBuffer);
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
2074 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE); 2072 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE);
2075 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); 2073 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
2076 m_iEntityStart = -1; 2074 m_iEntityStart = -1;
2077 } else { 2075 } else {
2078 if (m_iEntityStart < 0 && ch == L'&') { 2076 if (m_iEntityStart < 0 && ch == L'&') {
2079 m_iEntityStart = m_iDataLength - 1; 2077 m_iEntityStart = m_iDataLength - 1;
2080 } 2078 }
2081 } 2079 }
2082 m_pStart++; 2080 m_pStart++;
2083 } 2081 }
OLDNEW
« no previous file with comments | « xfa/fde/xml/fde_xml_imp.h ('k') | xfa/fde/xml/fde_xml_imp_unittest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698