aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBhargava Shastry <bshas3@gmail.com>2019-12-27 17:50:49 +0100
committerjonathanmetzman <31354670+jonathanmetzman@users.noreply.github.com>2019-12-27 08:50:49 -0800
commit62313d93480f2631ea82664c790fd01875b850a6 (patch)
treed073ece2e42037ab94d1dbb7afd3eb8dc903acfc
parent65956add1114508bb8b482b6abf9ad2240130c24 (diff)
downloadoss-fuzz-62313d93480f2631ea82664c790fd01875b850a6.tar.gz
xml proto converter: Fix ossfuzz issue 19507 (no return value). (#3167)
-rw-r--r--projects/xerces-c/xmlProtoConverter.cpp42
-rw-r--r--projects/xerces-c/xmlProtoConverter.h5
2 files changed, 46 insertions, 1 deletions
diff --git a/projects/xerces-c/xmlProtoConverter.cpp b/projects/xerces-c/xmlProtoConverter.cpp
index b2caf67a2..f8a47dee2 100644
--- a/projects/xerces-c/xmlProtoConverter.cpp
+++ b/projects/xerces-c/xmlProtoConverter.cpp
@@ -56,6 +56,9 @@ void ProtoConverter::visit(Prolog const& _x)
void ProtoConverter::visit(KeyValue const& _x)
{
+ if (!KeyValue::XmlNamespace_IsValid(_x.type()))
+ return;
+
switch (_x.type())
{
case KeyValue::ATTRIBUTES:
@@ -127,6 +130,9 @@ void ProtoConverter::visit(Content const& _x)
void ProtoConverter::visit(ElementDecl const& _x)
{
+ if (!ElementDecl::ContentSpec_IsValid(_x.spec()))
+ return;
+
m_output << "<!ELEMENT " << _x.name() << " ";
switch (_x.spec())
{
@@ -167,6 +173,9 @@ void ProtoConverter::visit(ElementDecl const& _x)
void ProtoConverter::visit(AttValue const& _x)
{
+ if (!isValid(_x))
+ return;
+
m_output << "\"";
string prefix;
switch (_x.type())
@@ -196,6 +205,9 @@ void ProtoConverter::visit(AttValue const& _x)
void ProtoConverter::visit(DefaultDecl const& _x)
{
+ if (!isValid(_x))
+ return;
+
switch (_x.type())
{
case DefaultDecl::REQUIRED:
@@ -219,6 +231,9 @@ void ProtoConverter::visit(DefaultDecl const& _x)
void ProtoConverter::visit(AttDef const& _x)
{
+ if (!isValid(_x))
+ return;
+
m_output << " " << removeNonAscii(_x.name()) << " ";
switch (_x.type())
{
@@ -323,6 +338,9 @@ void ProtoConverter::visit(PEDef const& _x)
void ProtoConverter::visit(EntityValue const& _x)
{
+ if (!isValid(_x))
+ return;
+
m_output << "\"";
string prefix;
switch (_x.type())
@@ -353,6 +371,9 @@ void ProtoConverter::visit(EntityValue const& _x)
void ProtoConverter::visit(EntityDecl const& _x)
{
+ if (!isValid(_x))
+ return;
+
m_output << "<!ENTITY ";
switch (_x.type())
{
@@ -373,6 +394,9 @@ void ProtoConverter::visit(EntityDecl const& _x)
void ProtoConverter::visit(ConditionalSect const& _x)
{
+ if (!isValid(_x))
+ return;
+
switch (_x.type())
{
case ConditionalSect::INCLUDE:
@@ -486,6 +510,9 @@ string ProtoConverter::getPredefined(Element_Id _x, string const& _prop)
/// Returns uri string for a given Element_Id type
string ProtoConverter::getUri(Element_Id _x)
{
+ if (!Element::Id_IsValid(_x))
+ return s_XInclude;
+
switch (_x)
{
case Element::XIINCLUDE:
@@ -504,6 +531,9 @@ string ProtoConverter::getUri(Element_Id _x)
void ProtoConverter::visit(Element const& _x)
{
+ if (!isValid(_x))
+ return;
+
// Predefined child node
string child = {};
// Predefined uri for child node
@@ -550,6 +580,9 @@ void ProtoConverter::visit(Element const& _x)
void ProtoConverter::visit(ExternalId const& _x)
{
+ if (!isValid(_x))
+ return;
+
switch (_x.type())
{
case ExternalId::SYSTEM:
@@ -581,6 +614,9 @@ void ProtoConverter::visit(DocTypeDecl const& _x)
void ProtoConverter::visit(VersionNum const& _x)
{
+ if (!isValid(_x))
+ return;
+
switch (_x.type())
{
case VersionNum::STANDARD:
@@ -596,6 +632,9 @@ void ProtoConverter::visit(VersionNum const& _x)
void ProtoConverter::visit(Encodings const& _x)
{
+ if (!Encodings::Enc_IsValid(_x.name()))
+ return;
+
m_output << " encoding=\"";
switch (_x.name())
{
@@ -699,6 +738,7 @@ void ProtoConverter::visit(XmlDeclaration const& _x)
break;
case XmlDeclaration_Standalone_XmlDeclaration_Standalone_INT_MIN_SENTINEL_DO_NOT_USE_:
case XmlDeclaration_Standalone_XmlDeclaration_Standalone_INT_MAX_SENTINEL_DO_NOT_USE_:
+ default:
break;
}
m_output << "?>\n";
@@ -715,4 +755,4 @@ string ProtoConverter::protoToString(XmlDocument const& _x)
{
visit(_x);
return m_output.str();
-} \ No newline at end of file
+}
diff --git a/projects/xerces-c/xmlProtoConverter.h b/projects/xerces-c/xmlProtoConverter.h
index a6333f1b3..501dde36c 100644
--- a/projects/xerces-c/xmlProtoConverter.h
+++ b/projects/xerces-c/xmlProtoConverter.h
@@ -89,6 +89,11 @@ private:
void visit(XmlDocument const&);
+ template <typename T>
+ bool isValid(T const& messageType) {
+ return T::Type_IsValid(messageType.type());
+ }
+
std::string removeNonAscii(std::string const&);
std::string getUri(Element_Id _x);
std::string getPredefined(Element_Id _x, std::string const&);