From 9e6b7e94c04e5e76fc5d65829ab7f7f992c0b3df Mon Sep 17 00:00:00 2001 From: wangqr Date: Sun, 8 Sep 2019 12:49:03 -0400 Subject: [PATCH] Fix crash in cache invalidation The original version uses a reverse iterator, whose .base() is invalid after KillMacroBlock() erases it. Fix TypesettingTools/Aegisub#33 Fix Aegisub/Aegisub#142 --- src/block_cache.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/block_cache.h b/src/block_cache.h index 9fcaf42e7..c79e3d6f0 100644 --- a/src/block_cache.h +++ b/src/block_cache.h @@ -150,8 +150,11 @@ public: } // Remove old entries until we're under the max size - for (auto it = age.rbegin(); size > max_size && it != age.rend(); ) - KillMacroBlock(**it++); + while (size > max_size) { + // When size > 0, age should never be empty + assert(!age.empty()); + KillMacroBlock(*age.back()); + } } /// @brief Obtain a data block from the cache