tdf#159666 Crash when table and line object are selected at the same time
before
commit e3077168072452fb8f1c0a8afb2992877cb96d1c
Author: Noel Grandin <noel.grandin@collabora.co.uk>
Date: Thu Jun 17 09:49:37 2021 +0200
loplugin:finalclasses
the cast in
const SdrEdgeObj* pEdge = static_cast<SdrEdgeObj*>(m_pObj);
would incorrectly cast a SdrTableObj, but it happened to do nothing
problematic.
After the above commit, the vtable layout changed and it started
crashing.
Work around it by use dynamic_cast and ignoring objects that are not
SdrEdgeObj.
Change-Id: Ibe03d4935b8eeb182e037b1648d841e26fa23ed4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163242
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
(cherry picked from commit bac09f76fd903c109b591a7bc15883e5653715ee)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163187
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Signed-off-by: Xisco Fauli <xiscofauli@libreoffice.org>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163256
(cherry picked from commit 39efb3e139ae6423ea093eedc449ac8c5b2cebf4)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163277
Reviewed-by: Thorsten Behrens <thorsten.behrens@allotropia.de>
Tested-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
diff --git a/svx/source/svdraw/svdhdl.cxx b/svx/source/svdraw/svdhdl.cxx
index 64f2997..62851f9 100644
--- a/svx/source/svdraw/svdhdl.cxx
+++ b/svx/source/svdraw/svdhdl.cxx
@@ -1604,66 +1604,67 @@ ImpEdgeHdl::~ImpEdgeHdl()
void ImpEdgeHdl::CreateB2dIAObject()
{
if(nObjHdlNum <= 1 && pObj)
{
// first throw away old one
GetRidOfIAObject();
BitmapColorIndex eColIndex = BitmapColorIndex::LightCyan;
BitmapMarkerKind eKindOfMarker = BitmapMarkerKind::Rect_7x7;
if(pHdlList)
{
SdrMarkView* pView = pHdlList->GetView();
if(pView && !pView->areMarkHandlesHidden())
{
const SdrEdgeObj* pEdge = static_cast<SdrEdgeObj*>(pObj);
if(pEdge->GetConnectedNode(nObjHdlNum == 0) != nullptr)
eColIndex = BitmapColorIndex::LightRed;
if(nPPntNum < 2)
{
// Handle with plus sign inside
eKindOfMarker = BitmapMarkerKind::Circ_7x7;
}
SdrPageView* pPageView = pView->GetSdrPageView();
if(pPageView)
{
for(sal_uInt32 b(0); b < pPageView->PageWindowCount(); b++)
{
const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
if(rPageWindow.GetPaintWindow().OutputToWindow())
{
const rtl::Reference< sdr::overlay::OverlayManager >& xManager = rPageWindow.GetOverlayManager();
if (xManager.is())
{
basegfx::B2DPoint aPosition(aPos.X(), aPos.Y());
std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject(CreateOverlayObject(
aPosition,
eColIndex,
eKindOfMarker));
// OVERLAYMANAGER
insertNewlyCreatedOverlayObjectForSdrHdl(
std::move(pNewOverlayObject),
rPageWindow.GetObjectContact(),
*xManager);
}
}
}
}
}
}
}
else
if(nObjHdlNum > 1 || !pObj)
{
// call parent
SdrHdl::CreateB2dIAObject();
return;
}
// first throw away old one
GetRidOfIAObject();
BitmapColorIndex eColIndex = BitmapColorIndex::LightCyan;
BitmapMarkerKind eKindOfMarker = BitmapMarkerKind::Rect_7x7;
if(!pHdlList)
return;
SdrMarkView* pView = pHdlList->GetView();
if(!pView || pView->areMarkHandlesHidden())
return;
// tdf#159666 Crash when table and line object are selected at the same time
auto pEdge = dynamic_cast<SdrEdgeObj*>(pObj);
if (!pEdge)
return;
if(pEdge->GetConnectedNode(nObjHdlNum == 0) != nullptr)
eColIndex = BitmapColorIndex::LightRed;
if(nPPntNum < 2)
{
// Handle with plus sign inside
eKindOfMarker = BitmapMarkerKind::Circ_7x7;
}
SdrPageView* pPageView = pView->GetSdrPageView();
if(!pPageView)
return;
for(sal_uInt32 b(0); b < pPageView->PageWindowCount(); b++)
{
const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
if(rPageWindow.GetPaintWindow().OutputToWindow())
{
const rtl::Reference< sdr::overlay::OverlayManager >& xManager = rPageWindow.GetOverlayManager();
if (xManager.is())
{
basegfx::B2DPoint aPosition(aPos.X(), aPos.Y());
std::unique_ptr<sdr::overlay::OverlayObject> pNewOverlayObject(CreateOverlayObject(
aPosition,
eColIndex,
eKindOfMarker));
// OVERLAYMANAGER
insertNewlyCreatedOverlayObjectForSdrHdl(
std::move(pNewOverlayObject),
rPageWindow.GetObjectContact(),
*xManager);
}
}
}
}