Repository: redis/redis

Issue:
[BUG] Possible memory leak in rdb.c, rdbLoadRio()
```
RedisModuleIO io;
moduleInitIOContext(io,mt,rdb,NULL,-1);
io.ver = 2;
/* Call the rdb_load method of the module providing the 10 bit
 * encoding version in the lower 10 bits of the module ID. */
if (mt->aux_load(&io,moduleid&1023, when) != REDISMODULE_OK || io.error) {
   moduleTypeNameByID(name,moduleid);
    serverLog(LL_WARNING,"The RDB file contains module AUX data for the module type '%s', that the responsible module is not able to load. Check for modules log above for additional clues.", name);
    goto eoferr;
}
if (io.ctx) {
    moduleFreeContext(io.ctx);
    zfree(io.ctx);
}
```
When `mt->aux_load(&io,moduleid&1023, when)` fails, previously-allocated `io.ctx` is lost.

A short description of the bug.

Reproduced within RediSearch sanitizer tests.

Steps to reproduce the behavior and/or a minimal code sample.

It's mostly a diagnostic problem, will fail Sanitizer/Valgrind.



Discussion:

Patch:
diff --git a/src/rdb.c b/src/rdb.c
index afdf57daf1a..ad7ede6c4e6 100644
--- a/src/rdb.c
+++ b/src/rdb.c
@@ -2766,15 +2766,16 @@ int rdbLoadRio(rio *rdb, int rdbflags, rdbSaveInfo *rsi) {
                 io.ver = 2;
                 /* Call the rdb_load method of the module providing the 10 bit
                  * encoding version in the lower 10 bits of the module ID. */
-                if (mt->aux_load(&io,moduleid&1023, when) != REDISMODULE_OK || io.error) {
-                    moduleTypeNameByID(name,moduleid);
-                    serverLog(LL_WARNING,"The RDB file contains module AUX data for the module type '%s', that the responsible module is not able to load. Check for modules log above for additional clues.", name);
-                    goto eoferr;
-                }
+                int rc = mt->aux_load(&io,moduleid&1023, when);
                 if (io.ctx) {
                     moduleFreeContext(io.ctx);
                     zfree(io.ctx);
                 }
+                if (rc != REDISMODULE_OK || io.error) {
+                    moduleTypeNameByID(name,moduleid);
+                    serverLog(LL_WARNING,"The RDB file contains module AUX data for the module type '%s', that the responsible module is not able to load. Check for modules log above for additional clues.", name);
+                    goto eoferr;
+                }
                 uint64_t eof = rdbLoadLen(rdb,NULL);
                 if (eof != RDB_MODULE_OPCODE_EOF) {
                     serverLog(LL_WARNING,"The RDB file contains module AUX data for the module '%s' that is not terminated by the proper module value EOF marker", name);