summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorCaolán McNamara <caolan.mcnamara@collabora.com>2025-03-10 14:45:22 +0000
committerCaolán McNamara <caolan.mcnamara@collabora.com>2025-03-10 17:14:55 +0100
commite384f2e8de9603c0e10bed9e35f26be08c0ca86c (patch)
treea28743e3ea391635d397e522352647dc0b710282 /sc
parentec65a00298ffbb30869dec222887f42f3ca4533e (diff)
crashtesting: crash on reimport of xlsx output of forum-pl-2758.ods
also seen as a leak as nothing is erased by: maRegisteredCellAttributes.erase(&rCandidate); once the style names are changed and the std::set isn't ordered according to its predicate anymore. Easiest thing to do here seems to run the rename of a cell style through CellAttributeHelper so it can reinsert the affected ScPatternAttrs Change-Id: I13486701f378228792baa2b378709b7d530c3770 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182743 Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com> Tested-by: Jenkins
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/patattr.hxx1
-rw-r--r--sc/inc/stlpool.hxx3
-rw-r--r--sc/source/core/data/patattr.cxx27
-rw-r--r--sc/source/core/data/stlpool.cxx11
-rw-r--r--sc/source/filter/ftools/ftools.cxx2
5 files changed, 43 insertions, 1 deletions
diff --git a/sc/inc/patattr.hxx b/sc/inc/patattr.hxx
index b75ee42e64f3..70e72ba403e6 100644
--- a/sc/inc/patattr.hxx
+++ b/sc/inc/patattr.hxx
@@ -92,6 +92,7 @@ public:
void CellStyleDeleted(const ScStyleSheet& rStyle);
void CellStyleCreated(ScDocument& rDoc, const OUString& rName);
+ void RenameCellStyle(ScStyleSheet& rStyle, const OUString& rNewName);
void UpdateAllStyleSheets(ScDocument& rDoc);
void AllStylesToNames();
void ReIndexRegistered();
diff --git a/sc/inc/stlpool.hxx b/sc/inc/stlpool.hxx
index 206ec79dc507..6d62affe7b71 100644
--- a/sc/inc/stlpool.hxx
+++ b/sc/inc/stlpool.hxx
@@ -56,6 +56,9 @@ public:
// Finds Para style with given name case-insensitively, or STR_STYLENAME_STANDARD
ScStyleSheet* FindAutoStyle(const OUString& rName);
+ // Rename rStyle to rNewName, and update CellAttribute holder
+ SC_DLLPUBLIC void Rename(SfxStyleSheetBase& rStyle, const OUString& rNewName, SfxStyleFamily eFam);
+
SC_DLLPUBLIC virtual SfxStyleSheetBase& Make( const OUString&, SfxStyleFamily eFam,
SfxStyleSearchBits nMask = SfxStyleSearchBits::All,
const OUString& rParentStyleSheetName = u""_ustr) override;
diff --git a/sc/source/core/data/patattr.cxx b/sc/source/core/data/patattr.cxx
index 46fe77288de7..846556ae2aa8 100644
--- a/sc/source/core/data/patattr.cxx
+++ b/sc/source/core/data/patattr.cxx
@@ -197,6 +197,33 @@ void CellAttributeHelper::CellStyleDeleted(const ScStyleSheet& rStyle)
}
}
+void CellAttributeHelper::RenameCellStyle(ScStyleSheet& rStyle, const OUString& rNewName)
+{
+ std::vector<const ScPatternAttr*> aChanged;
+
+ const OUString& rCandidateStyleName = rStyle.GetName();
+ auto it = maRegisteredCellAttributes.lower_bound(&rCandidateStyleName);
+ while(it != maRegisteredCellAttributes.end())
+ {
+ const ScPatternAttr* pCheck = *it;
+ if (CompareStringPtr(pCheck->GetStyleName(), &rCandidateStyleName) != 0)
+ break;
+ if (&rStyle == pCheck->GetStyleSheet())
+ {
+ aChanged.push_back(pCheck);
+ // The name will change, we have to re-insert it
+ it = maRegisteredCellAttributes.erase(it);
+ }
+ else
+ ++it;
+ }
+
+ rStyle.SetName(rNewName);
+
+ for (const ScPatternAttr* p : aChanged)
+ maRegisteredCellAttributes.insert(p);
+}
+
void CellAttributeHelper::CellStyleCreated(ScDocument& rDoc, const OUString& rName)
{
// If a style was created, don't keep any pattern with its name string in the pool,
diff --git a/sc/source/core/data/stlpool.cxx b/sc/source/core/data/stlpool.cxx
index aa4ae40dae1d..78a2a1339a63 100644
--- a/sc/source/core/data/stlpool.cxx
+++ b/sc/source/core/data/stlpool.cxx
@@ -114,6 +114,17 @@ rtl::Reference<SfxStyleSheetBase> ScStyleSheetPool::Create( const SfxStyleSheetB
return new ScStyleSheet( static_cast<const ScStyleSheet&>(rStyle) );
}
+void ScStyleSheetPool::Rename(SfxStyleSheetBase& rStyle, const OUString& rNewName, SfxStyleFamily eFamily)
+{
+ if (eFamily == SfxStyleFamily::Para)
+ {
+ assert(nullptr != pDoc);
+ pDoc->getCellAttributeHelper().RenameCellStyle(static_cast<ScStyleSheet&>(rStyle), rNewName);
+ return;
+ }
+ rStyle.SetName(rNewName);
+}
+
void ScStyleSheetPool::Remove( SfxStyleSheetBase* pStyle )
{
if ( pStyle )
diff --git a/sc/source/filter/ftools/ftools.cxx b/sc/source/filter/ftools/ftools.cxx
index d3145e537429..3e8259339103 100644
--- a/sc/source/filter/ftools/ftools.cxx
+++ b/sc/source/filter/ftools/ftools.cxx
@@ -231,7 +231,7 @@ ScStyleSheet& lclMakeStyleSheet( ScStyleSheetPool& rPool, const OUString& rStyle
// rename existing style
if( pOldStyleSheet && bForceName )
{
- pOldStyleSheet->SetName( aNewName );
+ rPool.Rename(*pOldStyleSheet, aNewName, eFamily);
aNewName = rStyleName;
}