diff options
author | Binbin <binloveplay1314@qq.com> | 2022-06-13 23:23:53 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-13 18:23:53 +0300 |
commit | 0a2f78837d82046ec7ffe77f8a2addcb591ff4f7 (patch) | |
tree | c22e46e9f549c53af46449b5d10a85dec7cf6312 /src/redis-check-rdb.c | |
parent | d4595dd94ff35e090fae02c0ca63b742faf237f9 (diff) | |
download | redis-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.c | 9 |
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); |