diff options
author | Matt Stancliff <matt@genges.com> | 2014-03-27 12:33:42 -0400 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2014-08-25 10:11:38 +0200 |
commit | 60c448b58469ea08aaae16b5667788cbd8044516 (patch) | |
tree | e5f8223922e0fddb58cf2765d1a1a1a2a6a9881a | |
parent | 879e18b7ec9728f52fb79eae99f8403ae3372096 (diff) | |
download | redis-60c448b58469ea08aaae16b5667788cbd8044516.tar.gz |
Cluster: Fix segfault if cluster config corrupt
This commit adds a size check after initial config
line parsing to make sure we have *at least* 8 arguments
per line.
Also, instead of asserting for cluster->myself, we just test
and error out normally (since the error does a hard exit anyway).
Closes #1597
-rw-r--r-- | src/cluster.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/cluster.c b/src/cluster.c index b3d9b6a72..07eaa637c 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -168,6 +168,9 @@ int clusterLoadConfig(char *filename) { continue; } + /* Regular config lines have at least eight fields */ + if (argc < 8) goto fmterr; + /* Create this node if it does not exist */ n = clusterLookupNode(argv[0]); if (!n) { @@ -268,11 +271,12 @@ int clusterLoadConfig(char *filename) { sdsfreesplitres(argv,argc); } + /* Config sanity check */ + if (server.cluster->myself == NULL) goto fmterr; + zfree(line); fclose(fp); - /* Config sanity check */ - redisAssert(server.cluster->myself != NULL); redisLog(REDIS_NOTICE,"Node configuration loaded, I'm %.40s", myself->name); /* Something that should never happen: currentEpoch smaller than @@ -287,7 +291,7 @@ fmterr: redisLog(REDIS_WARNING, "Unrecoverable error: corrupted cluster config file."); zfree(line); - fclose(fp); + if (fp) fclose(fp); exit(1); } |