basctl/source/basicide/iderdll.cxx | 1 + basctl/source/basicide/macrodlg.cxx | 7 +++++++ vcl/source/app/salvtables.cxx | 2 ++ vcl/source/treelist/treelist.cxx | 6 ++++++ 4 files changed, 16 insertions(+)
New commits: commit 499ecbf3a36990c29dc7e1fb9b0ecb1d297c2848 Author: Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de> AuthorDate: Mon Jun 20 10:27:26 2022 +0200 Commit: Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de> CommitDate: Tue Jun 21 11:33:16 2022 +0200 Fix crash when no valid EntryDescriptor found When opening macro run dlg, the last selected entry is displayed again. When no entry was found, a crash occured in some situations (GetLastEntryDescriptor() returned garbage). Initialize m_aLastEntryDesc properly, and make sure the method returns when no last selected macro was found. Also fix some nullptr crashes which occurred during UITests Change-Id: I7bd1a0b8824725f9935876ae26d8222410a3bc25 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136140 Tested-by: Jenkins Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de> diff --git a/basctl/source/basicide/iderdll.cxx b/basctl/source/basicide/iderdll.cxx index 022045050e9a..8e8a3dc3e114 100644 --- a/basctl/source/basicide/iderdll.cxx +++ b/basctl/source/basicide/iderdll.cxx @@ -145,6 +145,7 @@ ExtraData* Dll::GetExtraData () ExtraData::ExtraData () : + m_aLastEntryDesc(EntryDescriptor()), bChoosingMacro(false), bShellInCriticalSection(false) { diff --git a/basctl/source/basicide/macrodlg.cxx b/basctl/source/basicide/macrodlg.cxx index dbeaf396f3f3..03613c96c914 100644 --- a/basctl/source/basicide/macrodlg.cxx +++ b/basctl/source/basicide/macrodlg.cxx @@ -153,6 +153,13 @@ void MacroChooser::RestoreMacroDescription() aDesc = pData->GetLastEntryDescriptor(); } + // No valid EntryDescriptor found + if (aDesc.GetMethodName().isEmpty()) + { + m_xMacroNameEdit->select_region(0, 0); + return; + } + m_xBasicBox->SetCurrentEntry(aDesc); BasicSelectHdl(m_xBasicBox->get_widget()); diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index f548fe152b4f..b6db52c8b87d 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -4765,6 +4765,8 @@ void SalInstanceTreeView::set_text(const weld::TreeIter& rIter, const OUString& OUString SalInstanceTreeView::get_id(const weld::TreeIter& rIter) const { const SalInstanceTreeIter& rVclIter = static_cast<const SalInstanceTreeIter&>(rIter); + if (!rVclIter.iter) + return OUString(); const OUString* pStr = static_cast<const OUString*>(rVclIter.iter->GetUserData()); if (pStr) return *pStr; diff --git a/vcl/source/treelist/treelist.cxx b/vcl/source/treelist/treelist.cxx index 8f51e343fd98..fc81fa2eaa0c 100644 --- a/vcl/source/treelist/treelist.cxx +++ b/vcl/source/treelist/treelist.cxx @@ -102,6 +102,8 @@ bool SvTreeList::IsEntryVisible( const SvListView* pView, SvTreeListEntry* pEntr sal_uInt16 SvTreeList::GetDepth( const SvTreeListEntry* pEntry ) const { + if (!pEntry) + return 0; DBG_ASSERT(pEntry && pEntry!=pRootItem.get(),"GetDepth:Bad Entry"); sal_uInt16 nDepth = 0; while( pEntry && pEntry->pParent != pRootItem.get() ) @@ -1502,6 +1504,8 @@ SvTreeListEntries& SvTreeList::GetChildList( SvTreeListEntry* pParent ) const SvTreeListEntry* SvTreeList::GetParent( const SvTreeListEntry* pEntry ) const { + if (!pEntry) + return nullptr; const SvTreeListEntry* pParent = pEntry->pParent; if (pParent == pRootItem.get()) pParent = nullptr; @@ -1510,6 +1514,8 @@ const SvTreeListEntry* SvTreeList::GetParent( const SvTreeListEntry* pEntry ) co SvTreeListEntry* SvTreeList::GetParent( SvTreeListEntry* pEntry ) { + if (!pEntry) + return nullptr; SvTreeListEntry* pParent = pEntry->pParent; if (pParent == pRootItem.get()) pParent = nullptr;