From 6d61e5bf5b3bdbdfa3032b2009120c3cceb64607 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 14 Oct 2011 16:59:32 +0200 Subject: [PATCH] Exit with Fatal error at startup if the RDB file signature or version is wrong. Ref: issue #103 --- src/rdb.c | 7 ++++++- src/redis.c | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/rdb.c b/src/rdb.c index 1cfcd044..0bafd97c 100644 --- a/src/rdb.c +++ b/src/rdb.c @@ -947,19 +947,24 @@ int rdbLoad(char *filename) { rio rdb; fp = fopen(filename,"r"); - if (!fp) return REDIS_ERR; + if (!fp) { + errno = ENOENT; + return REDIS_ERR; + } rioInitWithFile(&rdb,fp); if (rioRead(&rdb,buf,9) == 0) goto eoferr; buf[9] = '\0'; if (memcmp(buf,"REDIS",5) != 0) { fclose(fp); redisLog(REDIS_WARNING,"Wrong signature trying to load DB from file"); + errno = EINVAL; return REDIS_ERR; } rdbver = atoi(buf+5); if (rdbver < 1 || rdbver > 2) { fclose(fp); redisLog(REDIS_WARNING,"Can't handle RDB format version %d",rdbver); + errno = EINVAL; return REDIS_ERR; } diff --git a/src/redis.c b/src/redis.c index 83aa3a82..dd693f6c 100644 --- a/src/redis.c +++ b/src/redis.c @@ -1802,8 +1802,13 @@ int main(int argc, char **argv) { if (loadAppendOnlyFile(server.appendfilename) == REDIS_OK) redisLog(REDIS_NOTICE,"DB loaded from append only file: %.3f seconds",(float)(ustime()-start)/1000000); } else { - if (rdbLoad(server.dbfilename) == REDIS_OK) - redisLog(REDIS_NOTICE,"DB loaded from disk: %.3f seconds",(float)(ustime()-start)/1000000); + if (rdbLoad(server.dbfilename) == REDIS_OK) { + redisLog(REDIS_NOTICE,"DB loaded from disk: %.3f seconds", + (float)(ustime()-start)/1000000); + } else if (errno != ENOENT) { + redisLog(REDIS_WARNING,"Fatal error loading the DB. Exiting."); + exit(1); + } } if (server.ipfd > 0) redisLog(REDIS_NOTICE,"The server is now ready to accept connections on port %d", server.port);