diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2022-08-13 18:07:58 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2022-08-13 20:23:05 +0200 |
commit | 89581c26be049b5af5bda96f21e908df81a1a194 (patch) | |
tree | 8a558c8d42c073378837708492404a3239216c74 | |
parent | 1743d74e87745a26043642a06dc8a57b1af29740 (diff) |
fix UBSAN downcast...does not point to an object of type 'ScUndoManager'
after
commit 640a6488a32e8f682788feb6cab01acfffca7fa7
Date: Thu Jul 28 19:06:59 2022 +0200
sc: allow undo of typing in 2 views independent from each other
/sc/source/ui/view/tabvwshb.cxx:815:35: runtime error: downcast of
address 0x6030007d3c20 which does not point to an object of type
'ScUndoManager'
0x6030007d3c20: note: object is of type 'EditUndoManager'
00 00 00 00 30 0a 0d 67 ed 7f 00 00 d0 d6 11 00 f0 60 00 00 40 7b b7
00 c0 60 00 00 00 00 00 00
^~~~~~~~~~~~~~~~~~~~~~~
vptr for 'EditUndoManager'
/sc/source/ui/view/tabvwshb.cxx:815:35
SfxItemSet&) /workdir/SdiTarget/sc/sdi/scslots.hxx:1456:1
SfxItemSet&, SfxSlot const*) /sfx2/source/control/dispatch.cxx:1658:9
/sfx2/source/control/bindings.cxx:260:22
/sfx2/source/control/bindings.cxx:1275:17
/sfx2/source/control/bindings.cxx:1220:5
/sfx2/sour
Change-Id: I4a505132184800a26725d602d3e27d1094e3ff65
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138233
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | sc/source/ui/view/tabvwshb.cxx | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/sc/source/ui/view/tabvwshb.cxx b/sc/source/ui/view/tabvwshb.cxx index 2b1a96f919d1..a26c126c84bd 100644 --- a/sc/source/ui/view/tabvwshb.cxx +++ b/sc/source/ui/view/tabvwshb.cxx @@ -812,7 +812,8 @@ void ScTabViewShell::ExecuteUndo(SfxRequest& rReq) void ScTabViewShell::GetUndoState(SfxItemSet &rSet) { SfxShell* pSh = GetViewData().GetDispatcher().GetShell(0); - ScUndoManager* pUndoManager = static_cast<ScUndoManager*>(pSh->GetUndoManager()); + SfxUndoManager* pUndoManager = pSh->GetUndoManager(); + ScUndoManager* pScUndoManager = dynamic_cast<ScUndoManager*>(pUndoManager); SfxWhichIter aIter(rSet); sal_uInt16 nWhich = aIter.FirstWhich(); @@ -841,41 +842,53 @@ void ScTabViewShell::GetUndoState(SfxItemSet &rSet) case SID_UNDO: { - if (pUndoManager->GetUndoActionCount()) + if (pScUndoManager) { - const SfxUndoAction* pAction = pUndoManager->GetUndoAction(); - SfxViewShell *pViewSh = GetViewShell(); - if (pViewSh && pAction->GetViewShellId() != pViewSh->GetViewShellId() - && !pUndoManager->IsViewUndoActionIndependent(this, o3tl::temporary(sal_uInt16()))) + if (pScUndoManager->GetUndoActionCount()) { - rSet.Put(SfxUInt32Item(SID_UNDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE))); + const SfxUndoAction* pAction = pScUndoManager->GetUndoAction(); + SfxViewShell *pViewSh = GetViewShell(); + if (pViewSh && pAction->GetViewShellId() != pViewSh->GetViewShellId() + && !pScUndoManager->IsViewUndoActionIndependent(this, o3tl::temporary(sal_uInt16()))) + { + rSet.Put(SfxUInt32Item(SID_UNDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE))); + } + else + { + rSet.Put( SfxStringItem( SID_UNDO, SvtResId(STR_UNDO)+pScUndoManager->GetUndoActionComment() ) ); + } } else - { - rSet.Put( SfxStringItem( SID_UNDO, SvtResId(STR_UNDO)+pUndoManager->GetUndoActionComment() ) ); - } + rSet.DisableItem( SID_UNDO ); } else - rSet.DisableItem( SID_UNDO ); + // get state from sfx view frame + GetViewFrame()->GetSlotState( nWhich, nullptr, &rSet ); break; } case SID_REDO: { - if (pUndoManager->GetRedoActionCount()) + if (pScUndoManager) { - const SfxUndoAction* pAction = pUndoManager->GetRedoAction(); - SfxViewShell *pViewSh = GetViewShell(); - if (pViewSh && pAction->GetViewShellId() != pViewSh->GetViewShellId()) + if (pScUndoManager->GetRedoActionCount()) { - rSet.Put(SfxUInt32Item(SID_REDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE))); + const SfxUndoAction* pAction = pScUndoManager->GetRedoAction(); + SfxViewShell *pViewSh = GetViewShell(); + if (pViewSh && pAction->GetViewShellId() != pViewSh->GetViewShellId()) + { + rSet.Put(SfxUInt32Item(SID_REDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE))); + } + else + { + rSet.Put(SfxStringItem(SID_REDO, SvtResId(STR_REDO) + pScUndoManager->GetRedoActionComment())); + } } else - { - rSet.Put(SfxStringItem(SID_REDO, SvtResId(STR_REDO) + pUndoManager->GetRedoActionComment())); - } + rSet.DisableItem( SID_REDO ); } else - rSet.DisableItem( SID_REDO ); + // get state from sfx view frame + GetViewFrame()->GetSlotState( nWhich, nullptr, &rSet ); break; } default: |