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;

Reply via email to