mirror of
https://gitee.com/openharmony/commonlibrary_ets_utils
synced 2025-02-03 08:17:08 +00:00
!1120 modify a crash issue with illegal characters in xml
Merge pull request !1120 from jiangkai/buffer_base64
This commit is contained in:
commit
26bd3843c7
@ -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)) {
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user