From 3b5a20dc02bd00032a19c2951bfa940e6d83aca0 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Mon, 16 Jul 2018 13:11:36 +0200 Subject: 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 Reviewed-by: Simon Hausmann --- src/xmlpatterns/schema/qxsdelement.cpp | 4 ++-- src/xmlpatterns/schema/qxsdelement_p.h | 6 +++--- 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"); -- cgit v1.2.1