summaryrefslogtreecommitdiff
path: root/src/redis-check-rdb.c
diff options
context:
space:
mode:
authorBinbin <binloveplay1314@qq.com>2022-06-13 23:23:53 +0800
committerGitHub <noreply@github.com>2022-06-13 18:23:53 +0300
commit0a2f78837d82046ec7ffe77f8a2addcb591ff4f7 (patch)
treec22e46e9f549c53af46449b5d10a85dec7cf6312 /src/redis-check-rdb.c
parentd4595dd94ff35e090fae02c0ca63b742faf237f9 (diff)
downloadredis-0a2f78837d82046ec7ffe77f8a2addcb591ff4f7.tar.gz
redis-check-rdb add when_opcode check for module aux (#10859)
In #9199, we add a `goto eoferr` in when_opcode check, this means that if the when_opcode check fails, we will abort the rdb loading, but this not reflected in the rdb-check tool. So someone can modify when_opcode to make rdb load fail, but rdb-check will report OK. Just a cleanup or a code consistency issue. ``` serverLog: # Internal error in RDB reading offset 0, function at rdb.c:3055 -> bad when_opcode [offset 0] Checking RDB file dump.rdb [offset 109] \o/ RDB looks OK! \o/ ``` Plus a minor memory leak fix like #9860, note that it will exit immediately after the eoferr, so it is not strictly a leak, so it is also a small cleanup.
Diffstat (limited to 'src/redis-check-rdb.c')
-rw-r--r--src/redis-check-rdb.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/redis-check-rdb.c b/src/redis-check-rdb.c
index accdc35b0..959768991 100644
--- a/src/redis-check-rdb.c
+++ b/src/redis-check-rdb.c
@@ -283,7 +283,10 @@ int redis_check_rdb(char *rdbfilename, FILE *fp) {
robj *auxkey, *auxval;
rdbstate.doing = RDB_CHECK_DOING_READ_AUX;
if ((auxkey = rdbLoadStringObject(&rdb)) == NULL) goto eoferr;
- if ((auxval = rdbLoadStringObject(&rdb)) == NULL) goto eoferr;
+ if ((auxval = rdbLoadStringObject(&rdb)) == NULL) {
+ decrRefCount(auxkey);
+ goto eoferr;
+ }
rdbCheckInfo("AUX FIELD %s = '%s'",
(char*)auxkey->ptr, (char*)auxval->ptr);
@@ -297,6 +300,10 @@ int redis_check_rdb(char *rdbfilename, FILE *fp) {
if ((moduleid = rdbLoadLen(&rdb,NULL)) == RDB_LENERR) goto eoferr;
if ((when_opcode = rdbLoadLen(&rdb,NULL)) == RDB_LENERR) goto eoferr;
if ((when = rdbLoadLen(&rdb,NULL)) == RDB_LENERR) goto eoferr;
+ if (when_opcode != RDB_MODULE_OPCODE_UINT) {
+ rdbCheckError("bad when_opcode");
+ goto err;
+ }
char name[10];
moduleTypeNameByID(name,moduleid);