diff options
author | WuYunlong <xzsyeb@126.com> | 2020-01-07 10:28:36 +0800 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2020-03-05 16:26:40 +0100 |
commit | 4780fe78ba611104475561bdcc8ac29dfb22676d (patch) | |
tree | 5f4279e820b0d3b15cfa3c56808bede844d559ce | |
parent | f3b77510effad00db8554331a257e93968a977c2 (diff) | |
download | redis-4780fe78ba611104475561bdcc8ac29dfb22676d.tar.gz |
Fix potential memory leak of clusterLoadConfig().
-rw-r--r-- | src/cluster.c | 25 |
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++); } |