From 2a3a035b64cbab6190ffa19830bda3bb1283e0c5 Mon Sep 17 00:00:00 2001 From: WuYunlong Date: Mon, 6 Jan 2020 19:56:50 +0800 Subject: [PATCH 1/4] Fix potential memory leak of rioWriteBulkStreamID(). --- src/aof.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/aof.c b/src/aof.c index 63b34b43f..efdd68efa 100644 --- a/src/aof.c +++ b/src/aof.c @@ -1149,7 +1149,10 @@ int rioWriteBulkStreamID(rio *r,streamID *id) { int retval; sds replyid = sdscatfmt(sdsempty(),"%U-%U",id->ms,id->seq); - if ((retval = rioWriteBulkString(r,replyid,sdslen(replyid))) == 0) return 0; + if ((retval = rioWriteBulkString(r,replyid,sdslen(replyid))) == 0) { + sdsfree(replyid); + return 0; + } sdsfree(replyid); return retval; } From 1588f30ae2de229689048f7d1f3abb6700c611ac Mon Sep 17 00:00:00 2001 From: WuYunlong Date: Tue, 7 Jan 2020 10:28:36 +0800 Subject: [PATCH 2/4] Fix potential memory leak of clusterLoadConfig(). --- src/cluster.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/cluster.c b/src/cluster.c index f603361cd..f9d8ae151 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -157,7 +157,10 @@ int clusterLoadConfig(char *filename) { } /* Regular config lines have at least eight fields */ - if (argc < 8) goto fmterr; + if (argc < 8) { + sdsfreesplitres(argv,argc); + goto fmterr; + } /* Create this node if it does not exist */ n = clusterLookupNode(argv[0]); @@ -166,7 +169,10 @@ int clusterLoadConfig(char *filename) { clusterAddNode(n); } /* Address and port */ - if ((p = strrchr(argv[1],':')) == NULL) goto fmterr; + if ((p = strrchr(argv[1],':')) == NULL) { + sdsfreesplitres(argv,argc); + goto fmterr; + } *p = '\0'; memcpy(n->ip,argv[1],strlen(argv[1])+1); char *port = p+1; @@ -247,7 +253,10 @@ int clusterLoadConfig(char *filename) { *p = '\0'; direction = p[1]; /* Either '>' or '<' */ slot = atoi(argv[j]+1); - if (slot < 0 || slot >= CLUSTER_SLOTS) goto fmterr; + if (slot < 0 || slot >= CLUSTER_SLOTS) { + sdsfreesplitres(argv,argc); + goto fmterr; + } p += 3; cn = clusterLookupNode(p); if (!cn) { @@ -267,8 +276,14 @@ int clusterLoadConfig(char *filename) { } else { start = stop = atoi(argv[j]); } - if (start < 0 || start >= CLUSTER_SLOTS) goto fmterr; - if (stop < 0 || stop >= CLUSTER_SLOTS) goto fmterr; + if (start < 0 || start >= CLUSTER_SLOTS) { + sdsfreesplitres(argv,argc); + goto fmterr; + } + if (stop < 0 || stop >= CLUSTER_SLOTS) { + sdsfreesplitres(argv,argc); + goto fmterr; + } while(start <= stop) clusterAddSlot(n, start++); } From e67a3a377f7b6f1993fbb2bed6d4b2333212a9f2 Mon Sep 17 00:00:00 2001 From: WuYunlong Date: Tue, 7 Jan 2020 11:17:52 +0800 Subject: [PATCH 3/4] Free allocated sds in pfdebugCommand() to avoid memory leak. --- src/hyperloglog.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hyperloglog.c b/src/hyperloglog.c index a44d15646..facd99743 100644 --- a/src/hyperloglog.c +++ b/src/hyperloglog.c @@ -1535,6 +1535,7 @@ void pfdebugCommand(client *c) { sds decoded = sdsempty(); if (hdr->encoding != HLL_SPARSE) { + sdsfree(decoded); addReplyError(c,"HLL encoding is not sparse"); return; } From dff5370c8be0dcef1728b95b17906d2494ce9bf2 Mon Sep 17 00:00:00 2001 From: antirez Date: Mon, 13 Jan 2020 13:25:37 +0100 Subject: [PATCH 4/4] Simplify #6379 changes. --- src/aof.c | 5 +---- src/cluster.c | 8 +++----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/aof.c b/src/aof.c index efdd68efa..9eeb3f1e2 100644 --- a/src/aof.c +++ b/src/aof.c @@ -1149,10 +1149,7 @@ int rioWriteBulkStreamID(rio *r,streamID *id) { int retval; sds replyid = sdscatfmt(sdsempty(),"%U-%U",id->ms,id->seq); - if ((retval = rioWriteBulkString(r,replyid,sdslen(replyid))) == 0) { - sdsfree(replyid); - return 0; - } + retval = rioWriteBulkString(r,replyid,sdslen(replyid)); sdsfree(replyid); return retval; } diff --git a/src/cluster.c b/src/cluster.c index f9d8ae151..c05e46f76 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -276,11 +276,9 @@ int clusterLoadConfig(char *filename) { } else { start = stop = atoi(argv[j]); } - if (start < 0 || start >= CLUSTER_SLOTS) { - sdsfreesplitres(argv,argc); - goto fmterr; - } - if (stop < 0 || stop >= CLUSTER_SLOTS) { + if (start < 0 || start >= CLUSTER_SLOTS || + stop < 0 || stop >= CLUSTER_SLOTS) + { sdsfreesplitres(argv,argc); goto fmterr; }