summaryrefslogtreecommitdiff
path: root/sc/source/core/tool
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2021-10-07 18:02:23 +0200
committerEike Rathke <erack@redhat.com>2021-10-07 20:14:25 +0200
commit9a0d52c95b6fd8639a56df2c2ceff07277253183 (patch)
treebc35d4f4b109cbb439ea02a5bd6d34b55bbed125 /sc/source/core/tool
parentc6bd2fd7c0b54b3a2c32e49db6c66fabe9db3689 (diff)
Blind fix crash in ScDBData::UpdateReference(), tdf#126926 follow-up
Crash reports at https://crashreport.libreoffice.org/stats/signature/ScDBData::UpdateReference(ScDocument%20const%20*,UpdateRefMode,short,long,short,short,long,short,short,long,short) No reproducer yet, for a possible reproducer see https://bugs.documentfoundation.org/show_bug.cgi?id=126926#c12 but creating such a scenario with 8 AutoFilters / sheets wasn't sufficient. However, ScDBCollection::NamedDBs (maNamedDBs) uses a std::set so after erase(iterator++) iterator is still valid, but ScDBCollection::AnonDBs maAnonDBs uses a std::vector for which after erase(iterator++) iterator may be invalid if vector was shrunk and reallocated. So use the iterator returning erase() instead to have a valid following iterator, and for consistency do that for both. A reproducer may need a bunch of sheets / anonymous AutoFilter for a vector to shrink and be reallocated, and it may depend on the plattform/compiler's implementation. Change-Id: Ib57294d8af9f486b734f4294d8d310ce0fa20551 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123224 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins
Diffstat (limited to 'sc/source/core/tool')
-rw-r--r--sc/source/core/tool/dbdata.cxx13
1 files changed, 7 insertions, 6 deletions
diff --git a/sc/source/core/tool/dbdata.cxx b/sc/source/core/tool/dbdata.cxx
index f95d1e94b681..285654ef25c7 100644
--- a/sc/source/core/tool/dbdata.cxx
+++ b/sc/source/core/tool/dbdata.cxx
@@ -1175,9 +1175,9 @@ bool ScDBCollection::NamedDBs::insert(std::unique_ptr<ScDBData> pData)
return r.second;
}
-void ScDBCollection::NamedDBs::erase(const iterator& itr)
+ScDBCollection::NamedDBs::iterator ScDBCollection::NamedDBs::erase(const iterator& itr)
{
- m_DBs.erase(itr);
+ return m_DBs.erase(itr);
}
bool ScDBCollection::NamedDBs::empty() const
@@ -1256,8 +1256,9 @@ void ScDBCollection::AnonDBs::insert(ScDBData* p)
m_DBs.push_back(std::unique_ptr<ScDBData>(p));
}
-void ScDBCollection::AnonDBs::erase(const iterator& itr) {
- m_DBs.erase(itr);
+ScDBCollection::AnonDBs::iterator ScDBCollection::AnonDBs::erase(const iterator& itr)
+{
+ return m_DBs.erase(itr);
}
bool ScDBCollection::AnonDBs::empty() const
@@ -1461,7 +1462,7 @@ void ScDBCollection::UpdateReference(UpdateRefMode eUpdateRefMode,
// Delete the database range, if some part of the reference became invalid.
if (it->get()->UpdateReference(&rDoc, eUpdateRefMode, nCol1, nRow1, nTab1, nCol2, nRow2,
nTab2, nDx, nDy, nDz))
- maNamedDBs.erase(it++);
+ it = maNamedDBs.erase(it);
else
++it;
}
@@ -1470,7 +1471,7 @@ void ScDBCollection::UpdateReference(UpdateRefMode eUpdateRefMode,
// Delete the database range, if some part of the reference became invalid.
if (it->get()->UpdateReference(&rDoc, eUpdateRefMode, nCol1, nRow1, nTab1, nCol2, nRow2,
nTab2, nDx, nDy, nDz))
- maAnonDBs.erase(it++);
+ it = maAnonDBs.erase(it);
else
++it;
}