mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 08:08:53 -05:00
fix rare condition where 'key' would already be destroyed while is was needed later on
This commit is contained in:
parent
2f996f0217
commit
c8a10631d1
6
src/vm.c
6
src/vm.c
@ -1075,6 +1075,11 @@ int dontWaitForSwappedKey(redisClient *c, robj *key) {
|
|||||||
listIter li;
|
listIter li;
|
||||||
struct dictEntry *de;
|
struct dictEntry *de;
|
||||||
|
|
||||||
|
/* The key object might be destroyed when deleted from the c->io_keys
|
||||||
|
* list (and the "key" argument is physically the same object as the
|
||||||
|
* object inside the list), so we need to protect it. */
|
||||||
|
incrRefCount(key);
|
||||||
|
|
||||||
/* Remove the key from the list of keys this client is waiting for. */
|
/* Remove the key from the list of keys this client is waiting for. */
|
||||||
listRewind(c->io_keys,&li);
|
listRewind(c->io_keys,&li);
|
||||||
while ((ln = listNext(&li)) != NULL) {
|
while ((ln = listNext(&li)) != NULL) {
|
||||||
@ -1095,6 +1100,7 @@ int dontWaitForSwappedKey(redisClient *c, robj *key) {
|
|||||||
if (listLength(l) == 0)
|
if (listLength(l) == 0)
|
||||||
dictDelete(c->db->io_keys,key);
|
dictDelete(c->db->io_keys,key);
|
||||||
|
|
||||||
|
decrRefCount(key);
|
||||||
return listLength(c->io_keys) == 0;
|
return listLength(c->io_keys) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user