Chromium Code Reviews| 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..60afa89038713744f953bdc4a85226e70e41fc2b 100644 |
| --- a/xfa/fde/xml/fde_xml_imp.cpp |
| +++ b/xfa/fde/xml/fde_xml_imp.cpp |
| @@ -1857,25 +1857,36 @@ void CFDE_XMLSyntaxParser::ParseTextChar(FX_WCHAR ch) { |
| ch = 0; |
| FX_WCHAR w; |
| if (iLen > 1 && csEntity[1] == L'x') { |
| - for (int32_t i = 2; i < iLen; i++) { |
| - w = csEntity[i]; |
| - if (w >= L'0' && w <= L'9') { |
| - ch = (ch << 4) + w - L'0'; |
| - } else if (w >= L'A' && w <= L'F') { |
| - ch = (ch << 4) + w - 55; |
| - } else if (w >= L'a' && w <= L'f') { |
| - ch = (ch << 4) + w - 87; |
| - } else { |
| - break; |
| + int32_t i = 2; |
| + while (i < iLen && csEntity[i] == '0') |
| + i++; |
| + if (iLen - i <= 4) { |
| + for (; i < iLen; i++) { |
| + w = csEntity[i]; |
| + if (w >= L'0' && w <= L'9') { |
| + ch = (ch << 4) + w - L'0'; |
| + } else if (w >= L'A' && w <= L'F') { |
| + ch = (ch << 4) + w - 55; |
| + } else if (w >= L'a' && w <= L'f') { |
| + ch = (ch << 4) + w - 87; |
| + } else { |
| + break; |
| + } |
| } |
| + } else { |
| + 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) { |
|
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
|
| + ch = ' '; |
| + break; |
| + } |
| } |
| } |
| if (ch != 0) { |