| Index: core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
 | 
| diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
 | 
| index 8d155e787b97c731e77feef064be752fec631fd6..a1aa686248000731f12eebc014ac2d65828425b1 100644
 | 
| --- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
 | 
| +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
 | 
| @@ -11,6 +11,7 @@
 | 
|  #include "core/include/fpdfapi/fpdf_module.h"
 | 
|  #include "core/include/fpdfapi/fpdf_page.h"
 | 
|  #include "core/include/fxcodec/fx_codec.h"
 | 
| +#include "core/include/fxcrt/fx_ext.h"
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| @@ -791,7 +792,7 @@ CFX_ByteString CPDF_StreamParser::ReadString() {
 | 
|          break;
 | 
|        case 1:
 | 
|          if (ch >= '0' && ch <= '7') {
 | 
| -          iEscCode = ch - '0';
 | 
| +          iEscCode = FXSYS_toDecimalDigit(ch);
 | 
|            status = 2;
 | 
|            break;
 | 
|          }
 | 
| @@ -816,7 +817,7 @@ CFX_ByteString CPDF_StreamParser::ReadString() {
 | 
|          break;
 | 
|        case 2:
 | 
|          if (ch >= '0' && ch <= '7') {
 | 
| -          iEscCode = iEscCode * 8 + ch - '0';
 | 
| +          iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch);
 | 
|            status = 3;
 | 
|          } else {
 | 
|            buf.AppendChar(iEscCode);
 | 
| @@ -826,7 +827,7 @@ CFX_ByteString CPDF_StreamParser::ReadString() {
 | 
|          break;
 | 
|        case 3:
 | 
|          if (ch >= '0' && ch <= '7') {
 | 
| -          iEscCode = iEscCode * 8 + ch - '0';
 | 
| +          iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch);
 | 
|            buf.AppendChar(iEscCode);
 | 
|            status = 0;
 | 
|          } else {
 | 
| @@ -859,50 +860,33 @@ CFX_ByteString CPDF_StreamParser::ReadHexString() {
 | 
|    if (!PositionIsInBounds())
 | 
|      return CFX_ByteString();
 | 
|  
 | 
| -  int ch = m_pBuf[m_Pos++];
 | 
|    CFX_ByteTextBuf buf;
 | 
| -  FX_BOOL bFirst = TRUE;
 | 
| +  bool bFirst = true;
 | 
|    int code = 0;
 | 
| -  while (1) {
 | 
| -    if (ch == '>') {
 | 
| -      break;
 | 
| -    }
 | 
| -    if (ch >= '0' && ch <= '9') {
 | 
| -      if (bFirst) {
 | 
| -        code = (ch - '0') * 16;
 | 
| -      } else {
 | 
| -        code += ch - '0';
 | 
| -        buf.AppendChar((char)code);
 | 
| -      }
 | 
| -      bFirst = !bFirst;
 | 
| -    } else if (ch >= 'A' && ch <= 'F') {
 | 
| -      if (bFirst) {
 | 
| -        code = (ch - 'A' + 10) * 16;
 | 
| -      } else {
 | 
| -        code += ch - 'A' + 10;
 | 
| -        buf.AppendChar((char)code);
 | 
| -      }
 | 
| -      bFirst = !bFirst;
 | 
| -    } else if (ch >= 'a' && ch <= 'f') {
 | 
| -      if (bFirst) {
 | 
| -        code = (ch - 'a' + 10) * 16;
 | 
| -      } else {
 | 
| -        code += ch - 'a' + 10;
 | 
| -        buf.AppendChar((char)code);
 | 
| -      }
 | 
| -      bFirst = !bFirst;
 | 
| -    }
 | 
| -    if (!PositionIsInBounds())
 | 
| +  while (PositionIsInBounds()) {
 | 
| +    int ch = m_pBuf[m_Pos++];
 | 
| +
 | 
| +    if (ch == '>')
 | 
|        break;
 | 
|  
 | 
| -    ch = m_pBuf[m_Pos++];
 | 
| +    if (!std::isxdigit(ch))
 | 
| +      continue;
 | 
| +
 | 
| +    int val = FXSYS_toHexDigit(ch);
 | 
| +    if (bFirst) {
 | 
| +      code = val * 16;
 | 
| +    } else {
 | 
| +      code += val;
 | 
| +      buf.AppendByte((uint8_t)code);
 | 
| +    }
 | 
| +    bFirst = !bFirst;
 | 
|    }
 | 
| -  if (!bFirst) {
 | 
| +  if (!bFirst)
 | 
|      buf.AppendChar((char)code);
 | 
| -  }
 | 
| -  if (buf.GetLength() > MAX_STRING_LENGTH) {
 | 
| +
 | 
| +  if (buf.GetLength() > MAX_STRING_LENGTH)
 | 
|      return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
 | 
| -  }
 | 
| +
 | 
|    return buf.GetByteString();
 | 
|  }
 | 
|  
 | 
| 
 |