From cee6d309d9edf4d2df3113d8dffe5b0382777c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20S=C3=B6derqvist?= Date: Tue, 31 Oct 2023 15:20:06 +0100 Subject: [PATCH] Don't crash when adding a forgotten node to blacklist twice (#12702) Add a defensive checks to prevent double freeing a node from the cluster blacklist. (cherry picked from commit 8d675950e6528e164454300d54aaf7bc024b075c) --- src/cluster.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cluster.c b/src/cluster.c index 0cb61d858..6b34b72c2 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -1134,6 +1134,9 @@ void clusterReset(int hard) { } dictReleaseIterator(di); + /* Empty the nodes blacklist. */ + dictEmpty(server.cluster->nodes_black_list, NULL); + /* Hard reset only: set epochs to 0, change node ID. */ if (hard) { sds oldname; @@ -2655,8 +2658,7 @@ void clusterProcessPingExtensions(clusterMsg *hdr, clusterLink *link) { clusterNode *n = clusterLookupNode(forgotten_node_ext->name, CLUSTER_NAMELEN); if (n && n != myself && !(nodeIsSlave(myself) && myself->slaveof == n)) { sds id = sdsnewlen(forgotten_node_ext->name, CLUSTER_NAMELEN); - dictEntry *de = dictAddRaw(server.cluster->nodes_black_list, id, NULL); - serverAssert(de != NULL); + dictEntry *de = dictAddOrFind(server.cluster->nodes_black_list, id); uint64_t expire = server.unixtime + ntohu64(forgotten_node_ext->ttl); dictSetUnsignedIntegerVal(de, expire); clusterDelNode(n);