From 93f754102d6f50e8b55eeb2abf94a8689f9f2a6c Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Fri, 4 Mar 2022 15:24:51 +0100 Subject: [PATCH] #8615 Qt Charts: fix use-after-free crash. Fixes #8615. --- ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp | 1 + .../UserInterface/RiuQtChartsPlotCurve.cpp | 8 +++++++- .../UserInterface/RiuQtChartsPlotWidget.cpp | 9 +++++++++ ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.h | 1 + 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp index cb51c7657e..19e34c3760 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp @@ -131,6 +131,7 @@ RimPlotCurve::~RimPlotCurve() { if ( m_plotCurve ) { + m_plotCurve->detach(); delete m_plotCurve; m_plotCurve = nullptr; } diff --git a/ApplicationLibCode/UserInterface/RiuQtChartsPlotCurve.cpp b/ApplicationLibCode/UserInterface/RiuQtChartsPlotCurve.cpp index 18d1132f76..2e0620d7d1 100644 --- a/ApplicationLibCode/UserInterface/RiuQtChartsPlotCurve.cpp +++ b/ApplicationLibCode/UserInterface/RiuQtChartsPlotCurve.cpp @@ -58,6 +58,8 @@ RiuQtChartsPlotCurve::~RiuQtChartsPlotCurve() { if ( m_plotWidget && m_plotWidget->qtChart() ) { + m_plotWidget->detach( this ); + auto* line = lineSeries(); if ( line ) { @@ -184,7 +186,11 @@ void RiuQtChartsPlotCurve::detach() scatterSeries()->hide(); } - if ( m_plotWidget ) setVisibleInLegend( false ); + if ( m_plotWidget ) + { + m_plotWidget->detach( this ); + setVisibleInLegend( false ); + } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.cpp b/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.cpp index 44396f14fc..a56f0ba2f2 100644 --- a/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.cpp +++ b/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.cpp @@ -814,6 +814,15 @@ void RiuQtChartsPlotWidget::attach( RiuPlotCurve* plotCurve, addToChart( m_scatterSeriesMap, plotCurve, scatterSeries, xAxis, yAxis, qtChartsPlotCurve ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuQtChartsPlotWidget::detach( RiuPlotCurve* plotCurve ) +{ + m_lineSeriesMap.erase( plotCurve ); + m_scatterSeriesMap.erase( plotCurve ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.h b/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.h index 6cf00b0f25..c3c05713e2 100644 --- a/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.h +++ b/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.h @@ -162,6 +162,7 @@ public: QtCharts::QAbstractSeries* scatterSeries, RiuPlotAxis xAxis, RiuPlotAxis yAxis ); + void detach( RiuPlotCurve* plotCurve ); QtCharts::QAbstractSeries* getLineSeries( const RiuPlotCurve* plotCurve ) const; QtCharts::QAbstractSeries* getScatterSeries( const RiuPlotCurve* plotCurve ) const;