summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2016-07-01 15:26:55 +0200
committerantirez <antirez@gmail.com>2016-07-01 15:26:55 +0200
commit7e220a964afdcb18bb660e898bc74a727a2a5848 (patch)
treed90496f4d113f59ed1b3ea03ff1944812c4e56c9
parente697153d18531e6b12d110bc0c57658ae686fb08 (diff)
downloadredis-rdb-check.tar.gz
In Redis RDB check: more details in error reportings.rdb-check
-rw-r--r--src/rdb.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/src/rdb.c b/src/rdb.c
index 9b4dcd027..3b7cec6d7 100644
--- a/src/rdb.c
+++ b/src/rdb.c
@@ -41,22 +41,29 @@
#include <sys/stat.h>
#include <sys/param.h>
-#define rdbExitReportCorruptRDB(reason) rdbCheckThenExit(reason, __LINE__);
+#define rdbExitReportCorruptRDB(...) rdbCheckThenExit(__LINE__,__VA_ARGS__)
extern int rdbCheckMode;
void rdbCheckError(const char *fmt, ...);
void rdbCheckSetError(const char *fmt, ...);
-void rdbCheckThenExit(char *reason, int where) {
- if (!rdbCheckMode) {
- serverLog(LL_WARNING, "Corrupt RDB detected at rdb.c:%d (%s). "
- "Running 'redis-check-rdb %s'",
- where, reason, server.rdb_filename);
+void rdbCheckThenExit(int linenum, char *reason, ...) {
+ va_list ap;
+ char msg[1024];
+ int len;
+
+ len = snprintf(msg,sizeof(msg),
+ "Internal error in RDB reading function at rdb.c:%d -> ", linenum);
+ va_start(ap,reason);
+ vsnprintf(msg+len,sizeof(msg)-len,reason,ap);
+ va_end(ap);
+
+ if (!rdbCheckMode) {
+ serverLog(LL_WARNING, "%s", msg);
char *argv[2] = {"",server.rdb_filename};
redis_check_rdb_main(2,argv);
} else {
- rdbCheckError("Internal error in RDB reading function at rdb.c:%d (%s)",
- where, reason);
+ rdbCheckError("%s",msg);
}
exit(1);
}
@@ -172,7 +179,8 @@ int rdbLoadLenByRef(rio *rdb, int *isencoded, uint64_t *lenptr) {
if (rioRead(rdb,&len,8) == 0) return -1;
*lenptr = ntohu64(len);
} else {
- rdbExitReportCorruptRDB("Unknown length encoding in rdbLoadLen()");
+ rdbExitReportCorruptRDB(
+ "Unknown length encoding %d in rdbLoadLen()",type);
return -1; /* Never reached. */
}
return 0;
@@ -240,7 +248,7 @@ void *rdbLoadIntegerObject(rio *rdb, int enctype, int flags, size_t *lenptr) {
val = (int32_t)v;
} else {
val = 0; /* anti-warning */
- rdbExitReportCorruptRDB("Unknown RDB integer encoding type");
+ rdbExitReportCorruptRDB("Unknown RDB integer encoding type %d",enctype);
}
if (plain || sds) {
char buf[LONG_STR_SIZE], *p;
@@ -457,7 +465,7 @@ void *rdbGenericLoadStringObject(rio *rdb, int flags, size_t *lenptr) {
case RDB_ENC_LZF:
return rdbLoadLzfStringObject(rdb,flags,lenptr);
default:
- rdbExitReportCorruptRDB("Unknown RDB encoding type");
+ rdbExitReportCorruptRDB("Unknown RDB string encoding type %d",len);
}
}
@@ -1288,7 +1296,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
hashTypeConvert(o, OBJ_ENCODING_HT);
break;
default:
- rdbExitReportCorruptRDB("Unknown encoding");
+ rdbExitReportCorruptRDB("Unknown RDB encoding type %d",rdbtype);
break;
}
} else if (rdbtype == RDB_TYPE_MODULE) {
@@ -1313,7 +1321,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
}
o = createModuleObject(mt,ptr);
} else {
- rdbExitReportCorruptRDB("Unknown object type");
+ rdbExitReportCorruptRDB("Unknown RDB encoding type %d",rdbtype);
}
return o;
}