summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@qt.io>2018-07-16 13:11:36 +0200
committerErik Verbruggen <erik.verbruggen@qt.io>2018-07-16 12:03:25 +0000
commit3b5a20dc02bd00032a19c2951bfa940e6d83aca0 (patch)
tree37489dd3184cd748be48e225e9cfbd2b3370b0e4
parentdf2fb4bbe406ffa080f2ada087822cf74aa2bd81 (diff)
downloadqtxmlpatterns-3b5a20dc02bd00032a19c2951bfa940e6d83aca0.tar.gz
Fix a cyclic reference that resulted in a memory leak
An element in a complex type would refer to its parenty by a QExplicitlySharedDataPointer, resulting in a reference cycle where none of the items woulf reach a zero refcount, resulting in a leak. Task-number: QTBUG-62691 Change-Id: I469c8cb38cc89ed778dac7534690a5d343b4bf25 Reviewed-by: Andy Shaw <andy.shaw@qt.io> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r--src/xmlpatterns/schema/qxsdelement.cpp4
-rw-r--r--src/xmlpatterns/schema/qxsdelement_p.h6
-rw-r--r--src/xmlpatterns/schema/qxsdschemaparser.cpp2
3 files changed, 6 insertions, 6 deletions
diff --git a/src/xmlpatterns/schema/qxsdelement.cpp b/src/xmlpatterns/schema/qxsdelement.cpp
index 8a150fb..94d3610 100644
--- a/src/xmlpatterns/schema/qxsdelement.cpp
+++ b/src/xmlpatterns/schema/qxsdelement.cpp
@@ -53,12 +53,12 @@ XsdElement::Scope::Variety XsdElement::Scope::variety() const
return m_variety;
}
-void XsdElement::Scope::setParent(const NamedSchemaComponent::Ptr &parent)
+void XsdElement::Scope::setParent(const NamedSchemaComponent *parent)
{
m_parent = parent;
}
-NamedSchemaComponent::Ptr XsdElement::Scope::parent() const
+const NamedSchemaComponent *XsdElement::Scope::parent() const
{
return m_parent;
}
diff --git a/src/xmlpatterns/schema/qxsdelement_p.h b/src/xmlpatterns/schema/qxsdelement_p.h
index 714d8f4..12dd12d 100644
--- a/src/xmlpatterns/schema/qxsdelement_p.h
+++ b/src/xmlpatterns/schema/qxsdelement_p.h
@@ -125,16 +125,16 @@ namespace QPatternist
/**
* Sets the @p parent complex type or model group definition of the element scope.
*/
- void setParent(const NamedSchemaComponent::Ptr &parent);
+ void setParent(const NamedSchemaComponent *parent);
/**
* Returns the parent complex type or model group definition of the element scope.
*/
- NamedSchemaComponent::Ptr parent() const;
+ const NamedSchemaComponent *parent() const;
private:
Variety m_variety;
- NamedSchemaComponent::Ptr m_parent;
+ const NamedSchemaComponent *m_parent = nullptr;
};
/**
diff --git a/src/xmlpatterns/schema/qxsdschemaparser.cpp b/src/xmlpatterns/schema/qxsdschemaparser.cpp
index 8bbda27..6c4eafe 100644
--- a/src/xmlpatterns/schema/qxsdschemaparser.cpp
+++ b/src/xmlpatterns/schema/qxsdschemaparser.cpp
@@ -4772,7 +4772,7 @@ XsdTerm::Ptr XsdSchemaParser::parseLocalElement(const XsdParticle::Ptr &particle
} else {
element->setScope(XsdElement::Scope::Ptr(new XsdElement::Scope()));
element->scope()->setVariety(XsdElement::Scope::Local);
- element->scope()->setParent(parent);
+ element->scope()->setParent(parent.data());
if (hasAttribute(QString::fromLatin1("name"))) {
const QString elementName = readNameAttribute("element");