summaryrefslogtreecommitdiff
path: root/sd
diff options
context:
space:
mode:
authorJustin Luth <justin_luth@sil.org>2022-02-02 11:00:07 +0200
committerCaolán McNamara <caolanm@redhat.com>2022-02-04 21:40:10 +0100
commit583185235389b55d6cfffac3067c0e1ccb2852b1 (patch)
tree73c57a801e1447467ea8090bdafc92a381ff4cfc /sd
parent5b0b004107f47ebfedd68d5916aa2176dad0d27b (diff)
related tdf#145868 sd: Clone SvxSearchItem to avoid use after free
I tested "if (mpSearchItem)" which passed, but then it crashed when trying to access (*mpSearchItem) == (*pSearchItem) because the mpSearchItem's DTOR had already been called prior to the if(mpSearchItem). Since mpSearchItem is never compared to another memory pointer, it is safe to assign it to a Clone. Steps to reproduce: 1.) open Impress and search for something 2.) change the search string to something else 3.) search again. Note that there isn't currently any code that hits this. I discovered it trying to craft a fix for bug 145868. Change-Id: Idc5f5a3e812ed3e49631347c35c3f4b2d8bb4127 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129347 Tested-by: Jenkins Tested-by: Caolán McNamara <caolanm@redhat.com> Reviewed-by: Justin Luth <jluth@mail.com> Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sd')
-rw-r--r--sd/inc/Outliner.hxx2
-rw-r--r--sd/source/ui/view/Outliner.cxx3
2 files changed, 2 insertions, 3 deletions
diff --git a/sd/inc/Outliner.hxx b/sd/inc/Outliner.hxx
index 772040f7a610..4a7100db3bb1 100644
--- a/sd/inc/Outliner.hxx
+++ b/sd/inc/Outliner.hxx
@@ -316,7 +316,7 @@ private:
search. It is set every time the
<member>SearchAndReplaceAll</member> method is called.
*/
- const SvxSearchItem* mpSearchItem;
+ std::unique_ptr<const SvxSearchItem> mpSearchItem;
/// The actual object iterator.
::sd::outliner::Iterator maObjectIterator;
diff --git a/sd/source/ui/view/Outliner.cxx b/sd/source/ui/view/Outliner.cxx
index 0f77f2070219..23353ba87c82 100644
--- a/sd/source/ui/view/Outliner.cxx
+++ b/sd/source/ui/view/Outliner.cxx
@@ -154,7 +154,6 @@ SdOutliner::SdOutliner( SdDrawDocument* pDoc, OutlinerMode nMode )
meStartEditMode(EditMode::Page),
mnStartPageIndex(sal_uInt16(-1)),
mpStartEditedObject(nullptr),
- mpSearchItem(nullptr),
mbPrepareSpellingPending(true)
{
SetStyleSheetPool(static_cast<SfxStyleSheetPool*>( mpDrawDocument->GetStyleSheetPool() ));
@@ -464,7 +463,7 @@ bool SdOutliner::StartSearchAndReplace (const SvxSearchItem* pSearchItem)
if ( ! bAbort)
{
meMode = SEARCH;
- mpSearchItem = pSearchItem;
+ mpSearchItem = std::unique_ptr<SvxSearchItem>(pSearchItem->Clone());
mbFoundObject = false;