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

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

Issue 2223823003: Guard against undefined shift. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Update windows result Created 4 years, 4 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 | « no previous file | 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 1839 matching lines...) Expand 10 before | Expand all | Expand 10 after
1850 if (m_iEntityStart > -1 && ch == L';') { 1850 if (m_iEntityStart > -1 && ch == L';') {
1851 CFX_WideString csEntity; 1851 CFX_WideString csEntity;
1852 m_BlockBuffer.GetTextData(csEntity, m_iEntityStart + 1, 1852 m_BlockBuffer.GetTextData(csEntity, m_iEntityStart + 1,
1853 (m_iDataLength - 1) - m_iEntityStart - 1); 1853 (m_iDataLength - 1) - m_iEntityStart - 1);
1854 int32_t iLen = csEntity.GetLength(); 1854 int32_t iLen = csEntity.GetLength();
1855 if (iLen > 0) { 1855 if (iLen > 0) {
1856 if (csEntity[0] == L'#') { 1856 if (csEntity[0] == L'#') {
1857 ch = 0; 1857 ch = 0;
1858 FX_WCHAR w; 1858 FX_WCHAR w;
1859 if (iLen > 1 && csEntity[1] == L'x') { 1859 if (iLen > 1 && csEntity[1] == L'x') {
1860 for (int32_t i = 2; i < iLen; i++) { 1860 int32_t i = 2;
1861 w = csEntity[i]; 1861 while (i < iLen && csEntity[i] == '0')
1862 if (w >= L'0' && w <= L'9') { 1862 i++;
1863 ch = (ch << 4) + w - L'0'; 1863 if (iLen - i <= 4) {
1864 } else if (w >= L'A' && w <= L'F') { 1864 for (; i < iLen; i++) {
1865 ch = (ch << 4) + w - 55; 1865 w = csEntity[i];
1866 } else if (w >= L'a' && w <= L'f') { 1866 if (w >= L'0' && w <= L'9') {
1867 ch = (ch << 4) + w - 87; 1867 ch = (ch << 4) + w - L'0';
1868 } else { 1868 } else if (w >= L'A' && w <= L'F') {
1869 break; 1869 ch = (ch << 4) + w - 55;
1870 } else if (w >= L'a' && w <= L'f') {
1871 ch = (ch << 4) + w - 87;
1872 } else {
1873 break;
1874 }
1870 } 1875 }
1876 } else {
1877 ch = ' ';
1871 } 1878 }
1872 } else { 1879 } else {
1873 for (int32_t i = 1; i < iLen; i++) { 1880 for (int32_t i = 1; i < iLen; i++) {
1874 w = csEntity[i]; 1881 w = csEntity[i];
1875 if (w < L'0' || w > L'9') { 1882 if (w < L'0' || w > L'9')
1883 break;
1884 ch = ch * 10 + w - L'0';
1885
1886 if (ch < 0) {
Wei Li 2016/08/10 17:28:30 Could you also use length based checking here? If
dsinclair 2016/08/10 17:31:04 I don't think so. This check doesn't do the shifts
Wei Li 2016/08/10 20:18:48 Sorry for the back and forth. I am trying to find
dsinclair 2016/08/10 20:58:08 No need to apologize, code working same on all pla
1887 ch = ' ';
1876 break; 1888 break;
1877 } 1889 }
1878 ch = ch * 10 + w - L'0';
1879 } 1890 }
1880 } 1891 }
1881 if (ch != 0) { 1892 if (ch != 0) {
1882 m_BlockBuffer.SetTextChar(m_iEntityStart, ch); 1893 m_BlockBuffer.SetTextChar(m_iEntityStart, ch);
1883 m_iEntityStart++; 1894 m_iEntityStart++;
1884 } 1895 }
1885 } else { 1896 } else {
1886 if (csEntity.Compare(L"amp") == 0) { 1897 if (csEntity.Compare(L"amp") == 0) {
1887 m_BlockBuffer.SetTextChar(m_iEntityStart, L'&'); 1898 m_BlockBuffer.SetTextChar(m_iEntityStart, L'&');
1888 m_iEntityStart++; 1899 m_iEntityStart++;
(...skipping 15 matching lines...) Expand all
1904 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE); 1915 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE);
1905 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); 1916 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
1906 m_iEntityStart = -1; 1917 m_iEntityStart = -1;
1907 } else { 1918 } else {
1908 if (m_iEntityStart < 0 && ch == L'&') { 1919 if (m_iEntityStart < 0 && ch == L'&') {
1909 m_iEntityStart = m_iDataLength - 1; 1920 m_iEntityStart = m_iDataLength - 1;
1910 } 1921 }
1911 } 1922 }
1912 m_pStart++; 1923 m_pStart++;
1913 } 1924 }
OLDNEW
« no previous file with comments | « no previous file | xfa/fde/xml/fde_xml_imp_unittest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698