summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWuYunlong <xzsyeb@126.com>2020-01-07 10:28:36 +0800
committerWuYunlong <xzsyeb@126.com>2020-01-07 10:28:36 +0800
commit9387f7333e0ccc200dda10032e517e2fb93cc368 (patch)
tree8cf7d10ac50d3a67062959486436e343869df711
parent2f8134a7ff9d3c435dad16a73bf96e3daa919a21 (diff)
downloadredis-9387f7333e0ccc200dda10032e517e2fb93cc368.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 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++);
}