diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-06-03 16:07:40 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-06-03 19:19:08 +0200 |
commit | c27e92b29efe573e2cda9844e9ca38965f502443 (patch) | |
tree | 667ba5d5b2072be4fec6c40b24839b446777e5d7 /include | |
parent | d4dd07320d931d8d979b6667bd894763d909cbb1 (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>
Diffstat (limited to 'include')
-rw-r--r-- | include/o3tl/lru_map.hxx | 8 |
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) { |