From 3e582d9e3fbed8cb94284ac1ab6105cf74eccfe0 Mon Sep 17 00:00:00 2001 From: Patrick Luby Date: Sat, 23 Dec 2023 09:35:06 -0500 Subject: Related: tdf#158807 mutex must be locked when disposing a VirtualDevice If the following .ppt document is opened in a debug build and the document is left open for a minute or two without changing any content, this destructor will be called on a non-main thread with the mutex unlocked: https://bugs.documentfoundation.org/attachment.cgi?id=46801 This hits an assert in VirtualDevice::ReleaseGraphics() so explicitly lock the mutex and explicitly dispose and clear the VirtualDevice instances variables. Change-Id: I5d371a4e99fca4aae2b6edc8b53eca10cb143aef Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161243 Tested-by: Jenkins Reviewed-by: Patrick Luby --- .../source/primitive2d/graphicprimitivehelper2d.cxx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'drawinglayer') diff --git a/drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx b/drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx index 7562459e0b70..cdda7d660e7e 100644 --- a/drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx +++ b/drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx @@ -358,6 +358,7 @@ namespace drawinglayer::primitive2d AnimatedGraphicPrimitive2D( const Graphic& rGraphic, basegfx::B2DHomMatrix aTransform); + virtual ~AnimatedGraphicPrimitive2D(); /// data read access const basegfx::B2DHomMatrix& getTransform() const { return maTransform; } @@ -421,6 +422,23 @@ namespace drawinglayer::primitive2d } } + AnimatedGraphicPrimitive2D::~AnimatedGraphicPrimitive2D() + { + // Related: tdf#158807 mutex must be locked when disposing a VirtualDevice + // If the following .ppt document is opened in a debug build + // and the document is left open for a minute or two without + // changing any content, this destructor will be called on a + // non-main thread with the mutex unlocked: + // https://bugs.documentfoundation.org/attachment.cgi?id=46801 + // This hits an assert in VirtualDevice::ReleaseGraphics() so + // explicitly lock the mutex and explicitly dispose and clear + // the VirtualDevice instances variables. + const SolarMutexGuard aSolarGuard; + + maVirtualDevice.disposeAndClear(); + maVirtualDeviceMask.disposeAndClear(); + } + bool AnimatedGraphicPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const { // do not use 'GroupPrimitive2D::operator==' here, that would compare -- cgit v1.2.3