summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWuYunlong <xzsyeb@126.com>2020-01-07 10:28:36 +0800
committerantirez <antirez@gmail.com>2020-03-05 16:26:40 +0100
commit4780fe78ba611104475561bdcc8ac29dfb22676d (patch)
tree5f4279e820b0d3b15cfa3c56808bede844d559ce
parentf3b77510effad00db8554331a257e93968a977c2 (diff)
downloadredis-4780fe78ba611104475561bdcc8ac29dfb22676d.tar.gz
Fix potential memory leak of clusterLoadConfig().
-rw-r--r--src/cluster.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/cluster.c b/src/cluster.c
index 858c0c9b6..42666746d 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++);
}