|
44 | 44 | #define RDB_LOAD_ENC (1<<0) |
45 | 45 | #define RDB_LOAD_PLAIN (1<<1) |
46 | 46 |
|
| 47 | +#define rdbExitReportCorruptRDB(reason) rdbCheckThenExit(reason, __LINE__); |
| 48 | + |
| 49 | +void rdbCheckThenExit(char *reason, int where) { |
| 50 | + redisLog(REDIS_WARNING, "Corrupt RDB detected at rdb.c:%d (%s). " |
| 51 | + "Running 'redis-check-rdb --dbfilename %s'", |
| 52 | + where, reason, server.rdb_filename); |
| 53 | + redis_check_rdb(server.rdb_filename); |
| 54 | + exit(1); |
| 55 | +} |
| 56 | + |
47 | 57 | static int rdbWriteRaw(rio *rdb, void *p, size_t len) { |
48 | 58 | if (rdb && rioWrite(rdb,p,len) == 0) |
49 | 59 | return -1; |
@@ -188,7 +198,7 @@ void *rdbLoadIntegerObject(rio *rdb, int enctype, int flags) { |
188 | 198 | val = (int32_t)v; |
189 | 199 | } else { |
190 | 200 | val = 0; /* anti-warning */ |
191 | | - redisPanic("Unknown RDB integer encoding type"); |
| 201 | + rdbExitReportCorruptRDB("Unknown RDB integer encoding type"); |
192 | 202 | } |
193 | 203 | if (plain) { |
194 | 204 | char buf[REDIS_LONGSTR_SIZE], *p; |
@@ -394,7 +404,7 @@ void *rdbGenericLoadStringObject(rio *rdb, int flags) { |
394 | 404 | case REDIS_RDB_ENC_LZF: |
395 | 405 | return rdbLoadLzfStringObject(rdb,flags); |
396 | 406 | default: |
397 | | - redisPanic("Unknown RDB encoding type"); |
| 407 | + rdbExitReportCorruptRDB("Unknown RDB encoding type"); |
398 | 408 | } |
399 | 409 | } |
400 | 410 |
|
@@ -923,7 +933,7 @@ void rdbRemoveTempFile(pid_t childpid) { |
923 | 933 | /* Load a Redis object of the specified type from the specified file. |
924 | 934 | * On success a newly allocated object is returned, otherwise NULL. */ |
925 | 935 | robj *rdbLoadObject(int rdbtype, rio *rdb) { |
926 | | - robj *o, *ele, *dec; |
| 936 | + robj *o = NULL, *ele, *dec; |
927 | 937 | size_t len; |
928 | 938 | unsigned int i; |
929 | 939 |
|
@@ -1078,7 +1088,9 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) { |
1078 | 1088 |
|
1079 | 1089 | /* Add pair to hash table */ |
1080 | 1090 | ret = dictAdd((dict*)o->ptr, field, value); |
1081 | | - redisAssert(ret == DICT_OK); |
| 1091 | + if (ret == DICT_ERR) { |
| 1092 | + rdbExitReportCorruptRDB("Duplicate keys detected"); |
| 1093 | + } |
1082 | 1094 | } |
1083 | 1095 |
|
1084 | 1096 | /* All pairs should be read by now */ |
@@ -1164,11 +1176,11 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) { |
1164 | 1176 | hashTypeConvert(o, REDIS_ENCODING_HT); |
1165 | 1177 | break; |
1166 | 1178 | default: |
1167 | | - redisPanic("Unknown encoding"); |
| 1179 | + rdbExitReportCorruptRDB("Unknown encoding"); |
1168 | 1180 | break; |
1169 | 1181 | } |
1170 | 1182 | } else { |
1171 | | - redisPanic("Unknown object type"); |
| 1183 | + rdbExitReportCorruptRDB("Unknown object type"); |
1172 | 1184 | } |
1173 | 1185 | return o; |
1174 | 1186 | } |
|
0 commit comments