summaryrefslogtreecommitdiff
path: root/dbaccess
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2018-01-31 14:34:31 +0100
committerAndras Timar <andras.timar@collabora.com>2018-03-06 15:03:39 +0100
commitac0e973f36a817c851bcfdc8e8bd27cefd54aa04 (patch)
tree69ad19c3af2bfb1eb5d1450f57b0f35bc67f1ba4 /dbaccess
parent8e4d18d61dc32ee82dc65d421bba14597295bf08 (diff)
tdf#114596 dbaccess: fix mysterious dataloss bug
OBookmarkContainer actually re-uses the reference count of ODatabaseSource, so converting ODatabaseSource::m_aBookmark to Reference created a cycle, which somehow causes the dataloss, because evidently something as important as storing the data must be done in the destructor. (regression from 2660d24a07866e083c5135ea263030f3e3a2e729) (cherry picked from commit 96ae2a3300811897c24cccb20f8c2faf382483df) tdf#114596 compilerplugins: add exception to [loplugin:refcounting] (cherry picked from commit e80da60895b45309fa1d018760d5f11cca4367f4) Change-Id: I4cad01dc9cdaf405c1eb31d6c0e161eb6712b78f Reviewed-on: https://gerrit.libreoffice.org/49026 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Michael Stahl <mstahl@redhat.com> Reviewed-by: Michael Stahl <mstahl@redhat.com> (cherry picked from commit b5440ce23b17d84f7971cb7ea35512d5cac69c9f)
Diffstat (limited to 'dbaccess')
-rw-r--r--dbaccess/source/core/dataaccess/datasource.cxx5
-rw-r--r--dbaccess/source/core/dataaccess/datasource.hxx3
2 files changed, 5 insertions, 3 deletions
diff --git a/dbaccess/source/core/dataaccess/datasource.cxx b/dbaccess/source/core/dataaccess/datasource.cxx
index 6d6771c2be88..8052903c0e49 100644
--- a/dbaccess/source/core/dataaccess/datasource.cxx
+++ b/dbaccess/source/core/dataaccess/datasource.cxx
@@ -472,7 +472,7 @@ ODatabaseSource::ODatabaseSource(const ::rtl::Reference<ODatabaseModelImpl>& _pI
:ModelDependentComponent( _pImpl )
,ODatabaseSource_Base( getMutex() )
,OPropertySetHelper( ODatabaseSource_Base::rBHelper )
- ,m_xBookmarks( new OBookmarkContainer( *this, getMutex() ) )
+ , m_Bookmarks(*this, getMutex())
,m_aFlushListeners( getMutex() )
{
// some kind of default
@@ -1162,7 +1162,8 @@ Reference< XConnection > ODatabaseSource::getConnection(const OUString& user, co
Reference< XNameAccess > SAL_CALL ODatabaseSource::getBookmarks( ) throw (RuntimeException, std::exception)
{
ModelMethodGuard aGuard( *this );
- return static_cast< XNameContainer* >(m_xBookmarks.get());
+ // tdf#114596 this may look nutty but see OBookmarkContainer::aquire()
+ return static_cast<XNameContainer*>(&m_Bookmarks);
}
Reference< XNameAccess > SAL_CALL ODatabaseSource::getQueryDefinitions( ) throw(RuntimeException, std::exception)
diff --git a/dbaccess/source/core/dataaccess/datasource.hxx b/dbaccess/source/core/dataaccess/datasource.hxx
index 1ea921cfaa0f..48a1b9bd3a58 100644
--- a/dbaccess/source/core/dataaccess/datasource.hxx
+++ b/dbaccess/source/core/dataaccess/datasource.hxx
@@ -82,7 +82,8 @@ class ODatabaseSource :public ModelDependentComponent // must be first
private:
using ODatabaseSource_Base::rBHelper;
- rtl::Reference<OBookmarkContainer> m_xBookmarks;
+ // note: this thing uses the ref-count of "this", see OBookmarkContainer::acquire!
+ OBookmarkContainer m_Bookmarks;
::comphelper::OInterfaceContainerHelper2 m_aFlushListeners;
private: