diff options
author | Michael Stahl <michael.stahl@allotropia.de> | 2021-12-17 18:46:29 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2021-12-20 11:44:31 +0100 |
commit | 40487d9c81c69c4e5ee1621e53c8162ae33c80b2 (patch) | |
tree | 2a7bdbcd5d9f430ba17631b84f7072707999fd52 | |
parent | 7d5984d7aed2bafcb599882b66bb0dde2d22ff3f (diff) |
tdf#145062 sw: try to fix UBSan crash in UITest
/sw/source/ui/fldui/fldref.cxx:470:32: runtime error: downcast of address 0x60700065f330 which does not point to an object of type 'SwGetRefField'
0x60700065f330: note: object is of type 'SwInputField'
a8 04 00 78 30 d8 f7 f1 8c 2b 00 00 60 9a d4 4c 8c 2b 00 00 00 b6 57 00 10 61 00 00 00 00 00 00
^~~~~~~~~~~~~~~~~~~~~~~
vptr for 'SwInputField'
#0 0x2b917d44b1fc in SwFieldRefPage::UpdateSubType(rtl::OUString const&) /sw/source/ui/fldui/fldref.cxx:470:32
#1 0x2b917d463aa9 in SwFieldRefPage::TypeHdl(weld::TreeView&) /sw/source/ui/fldui/fldref.cxx:358:5
#2 0x2b917d45f9e4 in SwFieldRefPage::Reset(SfxItemSet const*) /sw/source/ui/fldui/fldref.cxx:258:5
#3 0x2b917d436efd in SwFieldPage::EditNewField(bool) /sw/source/ui/fldui/fldpage.cxx:110:5
#4 0x2b917d48e725 in SwFieldDlg::ReInitTabPage(std::basic_string_view<char, std::char_traits<char> >, bool) /sw/source/ui/fldui/fldtdlg.cxx:214:16
#5 0x2b917d48f411 in SwFieldDlg::Activate() /sw/source/ui/fldui/fldtdlg.cxx:233:9
#9 0x2b8c8ac6f2b8 in Timer::Invoke() /vcl/source/app/timer.cxx:75:21
#16 0x2b8c8abaec67 in Application::Yield() /vcl/source/app/svapp.cxx:532:5
#17 0x2b8c87842191 in Dialog::Execute() /vcl/source/window/dialog.cxx:1056:9
#18 0x2b8c8a7bfabd in SalInstanceDialog::run() /vcl/source/app/salvtables.cxx:1685:23
#19 0x2b917cc6879c in weld::DialogController::run() /include/vcl/weld.hxx:2516:47
#20 0x2b917cf6e99c in SwFieldInputDlg::run() /sw/source/uibase/inc/inpdlg.hxx:56:47
Apparently SwFieldPage::Init() is called from SwFieldRefPage::Reset()
and replaces m_pCurField with whatever is at the cursor position now.
This should avoid crashes but it's kind of ugly. Should the dialog
perhaps switch to a different tab page?
Change-Id: I9c46665680090a5f164fd5d594fd3e7b1ab31f48
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127013
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
-rw-r--r-- | sw/source/ui/fldui/flddb.cxx | 12 | ||||
-rw-r--r-- | sw/source/ui/fldui/flddinf.cxx | 22 | ||||
-rw-r--r-- | sw/source/ui/fldui/fldref.cxx | 21 |
3 files changed, 44 insertions, 11 deletions
diff --git a/sw/source/ui/fldui/flddb.cxx b/sw/source/ui/fldui/flddb.cxx index f65abe0bdf7a..dd5e7046728d 100644 --- a/sw/source/ui/fldui/flddb.cxx +++ b/sw/source/ui/fldui/flddb.cxx @@ -303,12 +303,18 @@ void SwFieldDBPage::TypeHdl(const weld::TreeView* pBox) OUString sColumnName; if (nTypeId == SwFieldTypesEnum::Database) { - aData = static_cast<SwDBField*>(GetCurField())->GetDBData(); - sColumnName = static_cast<SwDBFieldType*>(GetCurField()->GetTyp())->GetColumnName(); + if (auto const*const pField = dynamic_cast<SwDBField*>(GetCurField())) + { + aData = pField->GetDBData(); + sColumnName = static_cast<SwDBFieldType*>(GetCurField()->GetTyp())->GetColumnName(); + } } else { - aData = static_cast<SwDBNameInfField*>(GetCurField())->GetDBData(pSh->GetDoc()); + if (auto *const pField = dynamic_cast<SwDBNameInfField*>(GetCurField())) + { + aData = pField->GetDBData(pSh->GetDoc()); + } } m_xDatabaseTLB->Select(aData.sDataSource, aData.sCommand, sColumnName); } diff --git a/sw/source/ui/fldui/flddinf.cxx b/sw/source/ui/fldui/flddinf.cxx index b35a12b77516..c9e07406ad5c 100644 --- a/sw/source/ui/fldui/flddinf.cxx +++ b/sw/source/ui/fldui/flddinf.cxx @@ -101,10 +101,13 @@ void SwFieldDokInfPage::Reset(const SfxItemSet* ) if (IsFieldEdit()) { const SwField* pCurField = GetCurField(); - nSubType = static_cast<const SwDocInfoField*>(pCurField)->GetSubType() & 0xff; + nSubType = pCurField->GetSubType() & 0xff; if( nSubType == DI_CUSTOM ) { - m_sOldCustomFieldName = static_cast<const SwDocInfoField*>(pCurField)->GetName(); + if (auto const pField = dynamic_cast<SwDocInfoField const*>(pCurField)) + { + m_sOldCustomFieldName = pField->GetName(); + } } m_xFormatLB->SetAutomaticLanguage(pCurField->IsAutomaticLanguage()); SwWrtShell *pSh = GetWrtShell(); @@ -313,12 +316,17 @@ IMPL_LINK_NOARG(SwFieldDokInfPage, SubTypeHdl, weld::TreeView&, void) bEnable = true; } - sal_uInt32 nFormat = IsFieldEdit() ? static_cast<SwDocInfoField*>(GetCurField())->GetFormat() : 0; + sal_uInt32 nFormat = 0; - sal_uInt16 nOldSubType = IsFieldEdit() ? (static_cast<SwDocInfoField*>(GetCurField())->GetSubType() & 0xff00) : 0; + sal_uInt16 nOldSubType = 0; if (IsFieldEdit()) { + if (auto const pField = dynamic_cast<SwDocInfoField const*>(GetCurField())) + { + nFormat = pField->GetFormat(); + nOldSubType = pField->GetSubType() & 0xff00; + } nPos = m_xSelectionLB->get_selected_index(); if (nPos != -1) { @@ -369,10 +377,14 @@ sal_Int32 SwFieldDokInfPage::FillSelectionLB(sal_uInt16 nSubType) sal_uInt16 nSize = 0; sal_Int32 nSelPos = -1; - sal_uInt16 nExtSubType = IsFieldEdit() ? (static_cast<SwDocInfoField*>(GetCurField())->GetSubType() & 0xff00) : 0; + sal_uInt16 nExtSubType = 0; if (IsFieldEdit()) { + if (auto const pField = dynamic_cast<SwDocInfoField const*>(GetCurField())) + { + nExtSubType = pField->GetSubType() & 0xff00; + } m_xFixedCB->set_active((nExtSubType & DI_SUB_FIXED) != 0); nExtSubType = ((nExtSubType & ~DI_SUB_FIXED) >> 8) - 1; } diff --git a/sw/source/ui/fldui/fldref.cxx b/sw/source/ui/fldui/fldref.cxx index 0b18e0d41e89..910587943607 100644 --- a/sw/source/ui/fldui/fldref.cxx +++ b/sw/source/ui/fldui/fldref.cxx @@ -332,9 +332,15 @@ IMPL_LINK_NOARG(SwFieldRefPage, TypeHdl, weld::TreeView&, void) break; case REF_SEQUENCEFLD: - sName = static_cast<SwGetRefField*>(GetCurField())->GetSetRefName(); + { + SwGetRefField const*const pRefField(dynamic_cast<SwGetRefField*>(GetCurField())); + if (pRefField) + { + sName = pRefField->GetSetRefName(); + } nFlag = REFFLDFLAG; break; + } } if (m_xTypeLB->find_text(sName) == -1) // reference to deleted mark @@ -470,9 +476,14 @@ void SwFieldRefPage::UpdateSubType(const OUString& filterString) SwWrtShell *pSh = GetWrtShell(); if(!pSh) pSh = ::GetActiveWrtShell(); - SwGetRefField* pRefField = static_cast<SwGetRefField*>(GetCurField()); + SwGetRefField const*const pRefField(dynamic_cast<SwGetRefField*>(GetCurField())); const sal_uInt16 nTypeId = m_xTypeLB->get_id(GetTypeSel()).toUInt32(); + if (!pRefField) + { + return; + } + OUString sOldSel; // #i83479# if ( m_xSelectionLB->get_visible() ) @@ -956,7 +967,11 @@ bool SwFieldRefPage::FillItemSet(SfxItemSet* ) } } - SwGetRefField* pRefField = static_cast<SwGetRefField*>(GetCurField()); + SwGetRefField const*const pRefField(dynamic_cast<SwGetRefField*>(GetCurField())); + if (!pRefField) + { + return false; + } if (REFFLDFLAG & nTypeId) { |