From 4dc728c1ce7c3bc8caabc4d6092195ad636e085a Mon Sep 17 00:00:00 2001 From: John Sully Date: Wed, 16 Oct 2019 12:26:48 -0400 Subject: [PATCH] Fix crash adding expire to key with a subkey expire already set Former-commit-id: 18a3768e07eb8c4feb4a666d95a19d97267ac381 --- src/server.h | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/server.h b/src/server.h index bd2b43fbc..cd2734a1d 100644 --- a/src/server.h +++ b/src/server.h @@ -805,12 +805,20 @@ public: // First check if the subkey already has an expiration for (auto &entry : m_vecexpireEntries) { - if (entry.spsubkey == nullptr) - continue; - if (sdscmp((sds)entry.spsubkey.get(), (sds)szSubkey) == 0) { - m_vecexpireEntries.erase(m_vecexpireEntries.begin() + (&entry - m_vecexpireEntries.data())); - break; + if (szSubkey != nullptr) + { + // if this is a subkey expiry then its not a match if the expireEntry is either for the + // primary key or a different subkey + if (entry.spsubkey == nullptr || sdscmp((sds)entry.spsubkey.get(), (sds)szSubkey) != 0) + continue; } + else + { + if (entry.spsubkey != nullptr) + continue; + } + m_vecexpireEntries.erase(m_vecexpireEntries.begin() + (&entry - m_vecexpireEntries.data())); + break; } auto itrInsert = std::lower_bound(m_vecexpireEntries.begin(), m_vecexpireEntries.end(), when); const char *subkey = (szSubkey) ? sdsdup(szSubkey) : nullptr;