!1120 modify a crash issue with illegal characters in xml

Merge pull request !1120 from jiangkai/buffer_base64
This commit is contained in:
openharmony_ci 2024-07-01 13:07:19 +00:00 committed by Gitee
commit 26bd3843c7
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
4 changed files with 50 additions and 34 deletions

View File

@ -542,7 +542,9 @@ namespace OHOS::xml {
{
if (tagFunc_ || attrFunc_ || tokenFunc_) {
while (type != TagEnum::END_DOCUMENT) {
ParseOneTag();
if (ParseOneTag() == TagEnum::ERROR) {
break;
}
bool bRec = false;
if (tagFunc_) {
napi_value returnVal = nullptr;
@ -604,7 +606,7 @@ namespace OHOS::xml {
default:
break;
}
return TagEnum::ERROR1;
return TagEnum::ERROR;
}
TagEnum XmlPullParser::DealLtGroup()
@ -731,7 +733,8 @@ namespace OHOS::xml {
c == '_' || c == ':' || relaxed) {
position_++;
} else {
xmlPullParserError_ = "name expected";
xmlPullParserError_ = "The node name contains invalid characters: ";
xmlPullParserError_ += c;
return "";
}
return ParseNameInner(start);
@ -793,7 +796,10 @@ namespace OHOS::xml {
bUnresolved_ = true;
}
void XmlPullParser::ParseEntity(std::string &out, bool isEntityToken, bool throwOnResolveFailure, TextEnum textEnum)
void XmlPullParser::ParseEntity(std::string &out,
bool isEntityToken,
bool throwOnResolveFailure,
TextEnum textEnum)
{
size_t start = out.length();
if (strXml_[position_++] != '&') {
@ -1035,6 +1041,9 @@ namespace OHOS::xml {
bool XmlPullParser::ParseStartTagFuncDeal(bool throwOnResolveFailure)
{
std::string attrName = ParseName();
if (attrName.empty()) {
return false;
}
int i = (attriCount_++) * 4; // 4: number of args
attributes.resize(attributes.size() + 4); // 4: number of args
attributes[i] = "";
@ -1071,20 +1080,20 @@ namespace OHOS::xml {
return true;
}
bool XmlPullParser::ParseStartTagFunc(bool xmldecl, bool throwOnResolveFailure)
TagEnum XmlPullParser::ParseStartTagFunc(bool xmldecl, bool throwOnResolveFailure)
{
while (true) {
SkipInvalidChar();
if (position_ >= max_ && DealLength(1)) {
xmlPullParserError_ = "UNEXPECTED_EOF";
return false;
return TagEnum::ERROR;
}
unsigned char temp = strXml_[position_];
if (xmldecl) {
if (temp == '?') {
position_++;
SkipChar('>');
return false;
return TagEnum::XML_DECLARATION;
}
} else {
if (temp == '/') {
@ -1100,22 +1109,22 @@ namespace OHOS::xml {
}
bool bRecv = ParseStartTagFuncDeal(throwOnResolveFailure);
if (!bRecv) {
return false;
return TagEnum::ERROR;
}
}
return true;
return TagEnum::OK;
}
void XmlPullParser::ParseStartTag(bool xmldecl, bool throwOnResolveFailure)
TagEnum XmlPullParser::ParseStartTag(bool xmldecl, bool throwOnResolveFailure)
{
if (!xmldecl) {
SkipChar('<');
}
name_ = ParseName();
attriCount_ = 0;
bool bRecv = ParseStartTagFunc(xmldecl, throwOnResolveFailure);
if (!bRecv) {
return;
TagEnum bRecv = ParseStartTagFunc(xmldecl, throwOnResolveFailure);
if (bRecv != TagEnum::OK) {
return bRecv;
}
size_t sp = depth++ * 4; // 4: number of args
elementStack_.resize(sp + 4); // 4: number of args
@ -1140,6 +1149,7 @@ namespace OHOS::xml {
elementStack_[sp] = namespace_;
elementStack_[sp + 1] = prefix_;
elementStack_[sp + 2] = name_; // 2: number of args
return TagEnum::OK;
}
void XmlPullParser::ParseDeclaration()
@ -1176,17 +1186,20 @@ namespace OHOS::xml {
text_ = "";
}
void XmlPullParser::ParseEndTag()
bool XmlPullParser::ParseEndTag()
{
SkipChar('<');
SkipChar('/');
name_ = ParseName();
if (name_.empty()) {
return false;
}
SkipInvalidChar();
SkipChar('>');
if (depth == 0) {
xmlPullParserError_ = "read end tag " + name_ + " with no tags open";
type = TagEnum::COMMENT;
return;
return true;
}
size_t sp = (depth - 1) * 4; // 4: number of args
if (name_ == elementStack_[sp + 3]) { // 3: number of args
@ -1196,6 +1209,7 @@ namespace OHOS::xml {
} else if (!relaxed) {
xmlPullParserError_ = "expected: /" + elementStack_[sp + 3] + " read: " + name_; // 3: number of args
}
return true;
}
std::string XmlPullParser::ParseDelimiterInfo(std::string delimiter, bool returnText)
@ -1549,11 +1563,15 @@ namespace OHOS::xml {
case TagEnum::START_DOCUMENT:
return type;
case TagEnum::START_TAG: {
ParseStartTag(false, false);
return type; }
if (ParseStartTag(false, false) == TagEnum::ERROR) {
return TagEnum::ERROR;
}
return type;}
case TagEnum::END_TAG: {
ParseEndTag();
return type; }
if (ParseEndTag()) {
return type;
}
return TagEnum::ERROR;}
case TagEnum::END_DOCUMENT:
return type;
case TagEnum::ENTITY_REFERENCE: {
@ -1579,7 +1597,7 @@ namespace OHOS::xml {
return TagEnum::OK;
default:
xmlPullParserError_ = "Unexpected token";
return TagEnum::ERROR1;
return TagEnum::ERROR;
}
}
@ -1596,9 +1614,7 @@ namespace OHOS::xml {
ParserPriorDeal();
while (true) {
TagEnum typeTem = ParseOneTagFunc();
if (typeTem == TagEnum::ERROR1) {
return TagEnum::ERROR1;
} else if (typeTem != TagEnum::OK) {
if (typeTem != TagEnum::OK) {
return typeTem;
}
if (depth == 0 && (type == TagEnum::ENTITY_REFERENCE || type == TagEnum::TEXT || type == TagEnum::CDSECT)) {

View File

@ -178,7 +178,7 @@ namespace OHOS::xml {
NOTATIONDECL,
PARAMETER_ENTITY_REF,
OK,
ERROR1
ERROR
};
enum class TextEnum {
@ -338,9 +338,9 @@ namespace OHOS::xml {
void ParseEntity(std::string& out, bool isEntityToken, bool throwOnResolveFailure, TextEnum textEnum);
std::string ParseTagValue(char delimiter, bool resolveEntities, bool throwOnResolveFailure, TextEnum textEnum);
bool ParseNsp();
void ParseStartTag(bool xmldecl, bool throwOnResolveFailure);
TagEnum ParseStartTag(bool xmldecl, bool throwOnResolveFailure);
void ParseDeclaration();
void ParseEndTag();
bool ParseEndTag();
std::string ParseDelimiterInfo(std::string delimiter, bool returnText);
std::string ParseDelimiter(bool returnText);
bool ParserDoctInnerInfo(bool requireSystemName, bool assignFields);
@ -366,7 +366,7 @@ namespace OHOS::xml {
TagEnum DealExclamationGroup();
void ParseEntityFunc(size_t start, std::string &out, bool isEntityToken, TextEnum textEnum);
bool ParseStartTagFuncDeal(bool throwOnResolveFailure);
bool ParseStartTagFunc(bool xmldecl, bool throwOnResolveFailure);
TagEnum ParseStartTagFunc(bool xmldecl, bool throwOnResolveFailure);
TagEnum ParseOneTagFunc();
size_t ParseTagValueInner(size_t &start, std::string &result, char delimiter, TextEnum textEnum, bool bFlag);
bool ParseTagValueFunc(char &c, bool bFlag, TextEnum textEnum, size_t &start, std::string &result);

View File

@ -1783,13 +1783,13 @@ HWTEST_F(NativeEngineTest, GetNSCount001, testing::ext::TestSize.Level0)
HWTEST_F(NativeEngineTest, DealExclamationGroup001, testing::ext::TestSize.Level0)
{
TagEnum tEnum = XmlTest::DealExclamationGroup("stER");
ASSERT_EQ(tEnum, TagEnum::ERROR1);
ASSERT_EQ(tEnum, TagEnum::ERROR);
tEnum = XmlTest::DealExclamationGroup("stNR");
ASSERT_EQ(tEnum, TagEnum::NOTATIONDECL);
tEnum = XmlTest::DealExclamationGroup("staR");
ASSERT_EQ(tEnum, TagEnum::ERROR1);
ASSERT_EQ(tEnum, TagEnum::ERROR);
}
/* @tc.name: DealLtGroup
@ -1988,7 +1988,7 @@ HWTEST_F(NativeEngineTest, ParseOneTagFunc, testing::ext::TestSize.Level0)
{
OHOS::xml::XmlTest testXml;
OHOS::xml::TagEnum res = testXml.TestParseOneTagFunc();
ASSERT_EQ(res, OHOS::xml::TagEnum::ERROR1);
ASSERT_EQ(res, OHOS::xml::TagEnum::ERROR);
}
/* @tc.name: ParseEntityDecl
@ -2157,7 +2157,7 @@ HWTEST_F(NativeEngineTest, ParseStartTagFuncDeal002, testing::ext::TestSize.Leve
ASSERT_TRUE(res);
res = XmlTest::ParseStartTagFuncDeal("==", false);
ASSERT_TRUE(res);
ASSERT_FALSE(res);
}
/* @tc.name: ParseStartTagFunc
@ -2167,8 +2167,8 @@ HWTEST_F(NativeEngineTest, ParseStartTagFuncDeal002, testing::ext::TestSize.Leve
HWTEST_F(NativeEngineTest, ParseStartTagFunc, testing::ext::TestSize.Level0)
{
OHOS::xml::XmlPullParser xmlPullParser("", "utf-8");
bool res = xmlPullParser.ParseStartTagFunc(false, false);
ASSERT_FALSE(res);
TagEnum res = xmlPullParser.ParseStartTagFunc(false, false);
ASSERT_EQ(res, OHOS::xml::TagEnum::ERROR);
}
/* @tc.name: ParseDeclaration002

View File

@ -250,7 +250,7 @@ bool XmlTest::TestParseComment(napi_env env)
TagEnum XmlTest::TestParseOneTagFunc()
{
OHOS::xml::XmlPullParser xml("1", "utf8");
xml.type = TagEnum::ERROR1;
xml.type = TagEnum::ERROR;
TagEnum res = xml.ParseOneTagFunc();
return res;
}