diff options
author | Erik Verbruggen <erik.verbruggen@qt.io> | 2018-07-16 13:11:36 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@qt.io> | 2018-07-16 12:03:25 +0000 |
commit | 3b5a20dc02bd00032a19c2951bfa940e6d83aca0 (patch) | |
tree | 37489dd3184cd748be48e225e9cfbd2b3370b0e4 /src | |
parent | df2fb4bbe406ffa080f2ada087822cf74aa2bd81 (diff) | |
download | qtxmlpatterns-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>
Diffstat (limited to 'src')
-rw-r--r-- | src/xmlpatterns/schema/qxsdelement.cpp | 4 | ||||
-rw-r--r-- | src/xmlpatterns/schema/qxsdelement_p.h | 6 | ||||
-rw-r--r-- | src/xmlpatterns/schema/qxsdschemaparser.cpp | 2 |
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"); |