From 95371d60fe6ecc471a12caba5aadef0f77292378 Mon Sep 17 00:00:00 2001 From: John Sully Date: Sat, 13 Jul 2019 20:35:44 -0400 Subject: [PATCH] Fix crash with traditional expiration Former-commit-id: 0ba5b2c3d66d3a1a520f223ad2c288c22601bd5a --- src/db.cpp | 5 ++++- src/expire.cpp | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/db.cpp b/src/db.cpp index 9a47b415d..40e44a7c1 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -1234,7 +1234,10 @@ void setExpire(client *c, redisDb *db, robj *key, robj *subkey, long long when) if (((robj*)dictGetVal(kde))->FExpires()) { auto itr = db->setexpire->find((sds)dictGetKey(kde)); serverAssert(itr != db->setexpire->end()); - itr->update(szSubKey, when); + expireEntry eNew(std::move(*itr)); + eNew.update(szSubKey, when); + db->setexpire->erase(itr); + db->setexpire->insert(eNew); } else { diff --git a/src/expire.cpp b/src/expire.cpp index b6833db04..c10047d2c 100644 --- a/src/expire.cpp +++ b/src/expire.cpp @@ -68,7 +68,10 @@ void activeExpireCycleExpireFullKey(redisDb *db, const char *key) { * to the function to avoid too many gettimeofday() syscalls. */ void activeExpireCycleExpire(redisDb *db, expireEntry &e, long long now) { if (!e.FFat()) + { activeExpireCycleExpireFullKey(db, e.key()); + return; + } expireEntryFat *pfat = e.pfatentry(); dictEntry *de = dictFind(db->pdict, e.key());