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
This commit is contained in:
Caolán McNamara
2025-03-10 17:14:55 +01:00
parent ec65a00298
commit e384f2e8de
5 changed files with 43 additions and 1 deletions
+1
View File
@@ -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();
+3
View File
@@ -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;
+27
View File
@@ -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,
+11
View File
@@ -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 )
+1 -1
View File
@@ -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;
}