chart2/source/inc/Diagram.hxx                      |   10 +++-------
 chart2/source/model/main/Diagram.cxx               |   20 +++++++++++++++++++-
 chart2/source/tools/AxisHelper.cxx                 |    6 +++---
 chart2/source/tools/ChartModelHelper.cxx           |    6 +++---
 chart2/source/view/main/SeriesPlotterContainer.cxx |    6 +++---
 5 files changed, 31 insertions(+), 17 deletions(-)

New commits:
commit 84646117baa2ac3463a007207b6b5d1d3cf0e3ae
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Sat Apr 1 21:09:29 2023 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Sat Apr 1 21:57:57 2023 +0200

    fix locking in chart::Diagram
    
    we can't return a reference to internal state that needs to be protected by 
a mutex
    
    Change-Id: I13c0128559546cc2078584fc0de818c568617b7e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149914
    Tested-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/chart2/source/inc/Diagram.hxx b/chart2/source/inc/Diagram.hxx
index 874e8e904e5d..eba06976cbbf 100644
--- a/chart2/source/inc/Diagram.hxx
+++ b/chart2/source/inc/Diagram.hxx
@@ -163,19 +163,15 @@ public:
         std::vector< rtl::Reference< ::chart::BaseCoordinateSystem > >
         tCoordinateSystemContainerType;
 
-    const tCoordinateSystemContainerType & getBaseCoordinateSystems() { return 
m_aCoordSystems; }
+    tCoordinateSystemContainerType getBaseCoordinateSystems() const;
     void setCoordinateSystems(
         const std::vector< rtl::Reference< ::chart::BaseCoordinateSystem > >& 
aCoordinateSystems );
 
-    const rtl::Reference< ::chart::Legend > & getLegend2() const { return 
m_xLegend; }
+    rtl::Reference< ::chart::Legend > getLegend2() const;
     void setLegend(const rtl::Reference< ::chart::Legend > &);
 
     void setDataTable(const rtl::Reference<::chart::DataTable>& xNewDataTable);
-
-    rtl::Reference<::chart::DataTable> const& getDataTableRef() const
-    {
-        return m_xDataTable;
-    };
+    rtl::Reference<::chart::DataTable> getDataTableRef() const;
 
     DiagramPositioningMode getDiagramPositioningMode();
 
diff --git a/chart2/source/model/main/Diagram.cxx 
b/chart2/source/model/main/Diagram.cxx
index 1522d168c542..63bead4ef1b2 100644
--- a/chart2/source/model/main/Diagram.cxx
+++ b/chart2/source/model/main/Diagram.cxx
@@ -354,6 +354,12 @@ uno::Reference< chart2::XLegend > SAL_CALL 
Diagram::getLegend()
     return m_xLegend;
 }
 
+rtl::Reference< ::chart::Legend > Diagram::getLegend2() const
+{
+    MutexGuard aGuard( m_aMutex );
+    return m_xLegend;
+}
+
 void SAL_CALL Diagram::setLegend( const uno::Reference< chart2::XLegend >& 
xNewLegend )
 {
     auto pLegend = dynamic_cast<Legend*>(xNewLegend.get());
@@ -606,6 +612,12 @@ uno::Sequence< uno::Reference< chart2::XCoordinateSystem > 
> SAL_CALL Diagram::g
     return comphelper::containerToSequence<uno::Reference< 
chart2::XCoordinateSystem >>( m_aCoordSystems );
 }
 
+Diagram::tCoordinateSystemContainerType Diagram::getBaseCoordinateSystems() 
const
+{
+    MutexGuard aGuard( m_aMutex );
+    return m_aCoordSystems;
+}
+
 void SAL_CALL Diagram::setCoordinateSystems(
     const Sequence< Reference< chart2::XCoordinateSystem > >& 
aCoordinateSystems )
 {
@@ -772,7 +784,13 @@ void SAL_CALL Diagram::getFastPropertyValue( Any& rValue, 
sal_Int32 nHandle ) co
 
 uno::Reference<chart2::XDataTable> SAL_CALL Diagram::getDataTable()
 {
-    MutexGuard aGuard(m_aMutex);
+    MutexGuard aGuard( m_aMutex );
+    return m_xDataTable;
+}
+
+rtl::Reference<::chart::DataTable> Diagram::getDataTableRef() const
+{
+    MutexGuard aGuard( m_aMutex );
     return m_xDataTable;
 }
 
diff --git a/chart2/source/tools/AxisHelper.cxx 
b/chart2/source/tools/AxisHelper.cxx
index 3fe146d259bc..7e8229352181 100644
--- a/chart2/source/tools/AxisHelper.cxx
+++ b/chart2/source/tools/AxisHelper.cxx
@@ -552,9 +552,9 @@ rtl::Reference< ::chart::BaseCoordinateSystem > 
AxisHelper::getCoordinateSystemB
 {
     if(!xDiagram.is())
         return nullptr;
-    auto & rCooSysList = xDiagram->getBaseCoordinateSystems();
-    if(0<=nIndex && o3tl::make_unsigned(nIndex) < rCooSysList.size())
-        return rCooSysList[nIndex];
+    auto aCooSysList = xDiagram->getBaseCoordinateSystems();
+    if(0<=nIndex && o3tl::make_unsigned(nIndex) < aCooSysList.size())
+        return aCooSysList[nIndex];
     return nullptr;
 }
 
diff --git a/chart2/source/tools/ChartModelHelper.cxx 
b/chart2/source/tools/ChartModelHelper.cxx
index 3018797b6dca..0aa2288ff888 100644
--- a/chart2/source/tools/ChartModelHelper.cxx
+++ b/chart2/source/tools/ChartModelHelper.cxx
@@ -81,9 +81,9 @@ rtl::Reference< BaseCoordinateSystem > 
ChartModelHelper::getFirstCoordinateSyste
     rtl::Reference< Diagram > xDiagram = xModel->getFirstChartDiagram();
     if( xDiagram.is() )
     {
-        auto& rCooSysSeq( xDiagram->getBaseCoordinateSystems() );
-        if( !rCooSysSeq.empty() )
-            return rCooSysSeq[0];
+        auto aCooSysSeq( xDiagram->getBaseCoordinateSystems() );
+        if( !aCooSysSeq.empty() )
+            return aCooSysSeq[0];
     }
     return nullptr;
 }
diff --git a/chart2/source/view/main/SeriesPlotterContainer.cxx 
b/chart2/source/view/main/SeriesPlotterContainer.cxx
index de8c2c78cd4f..bcc5b0f482a3 100644
--- a/chart2/source/view/main/SeriesPlotterContainer.cxx
+++ b/chart2/source/view/main/SeriesPlotterContainer.cxx
@@ -180,11 +180,11 @@ void 
SeriesPlotterContainer::initializeCooSysAndSeriesPlotter(ChartModel& rChart
 
     //iterate through all coordinate systems
     uno::Reference<XColorScheme> 
xColorScheme(xDiagram->getDefaultColorScheme());
-    auto& rCooSysList = xDiagram->getBaseCoordinateSystems();
+    auto aCooSysList = xDiagram->getBaseCoordinateSystems();
     sal_Int32 nGlobalSeriesIndex = 0; //for automatic symbols
-    for (std::size_t nCS = 0; nCS < rCooSysList.size(); ++nCS)
+    for (std::size_t nCS = 0; nCS < aCooSysList.size(); ++nCS)
     {
-        rtl::Reference<BaseCoordinateSystem> xCooSys(rCooSysList[nCS]);
+        rtl::Reference<BaseCoordinateSystem> xCooSys(aCooSysList[nCS]);
         VCoordinateSystem* pVCooSys
             = SeriesPlotterContainer::addCooSysToList(m_rVCooSysList, xCooSys, 
rChartModel);
         // Let's check whether the secondary Y axis is visible

Reply via email to