summaryrefslogtreecommitdiff
path: root/include/o3tl
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2019-06-03 16:07:40 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2019-06-04 09:35:47 +0200
commit4abdaf4afb2245d404f6709124b3c627b07b8a3c (patch)
treec7e5546909acc6607656c9534c1a067c633bf77b /include/o3tl
parent49a17e9ba500451929a2c4cb63c30e50e989886c (diff)
fix crash in lru_map/SalBitmap on shutdown
When we shut down, we destroy the various caches, in the process of which SalBitmap calls back into it's owning cache, causing a SIGSEGV. Found while loading files from tdf#83426 Change-Id: I53db1621a0fdb75a8e66582662b0e2666499192b Reviewed-on: https://gerrit.libreoffice.org/73387 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> (cherry picked from commit c27e92b29efe573e2cda9844e9ca38965f502443) Reviewed-on: https://gerrit.libreoffice.org/73415
Diffstat (limited to 'include/o3tl')
-rw-r--r--include/o3tl/lru_map.hxx8
1 files changed, 8 insertions, 0 deletions
diff --git a/include/o3tl/lru_map.hxx b/include/o3tl/lru_map.hxx
index 003da59551b5..54378a319ece 100644
--- a/include/o3tl/lru_map.hxx
+++ b/include/o3tl/lru_map.hxx
@@ -69,6 +69,14 @@ public:
lru_map(size_t nMaxSize)
: mMaxSize(nMaxSize ? nMaxSize : std::min(mLruMap.max_size(), mLruList.max_size()))
{}
+ ~lru_map()
+ {
+ // Some code .e.g. SalBitmap likes to remove itself from a cache during it's destructor, which means we
+ // get calls into lru_map while we are in destruction, so use the swap-and-clear idiom to avoid those problems.
+ mLruMap.clear();
+ list_t aLruListTemp;
+ aLruListTemp.swap(mLruList);
+ }
void insert(key_value_pair_t& rPair)
{