From a37cca36441abe697e884651a5558c4650534381 Mon Sep 17 00:00:00 2001 From: Oran Agra Date: Wed, 11 Dec 2019 12:35:00 +0200 Subject: [PATCH] fix leak in RM_LoadDataTypeFromString, and save --- src/module.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/module.c b/src/module.c index 111e1c202..dd80524ca 100644 --- a/src/module.c +++ b/src/module.c @@ -3963,6 +3963,7 @@ void RM_DigestEndSequence(RedisModuleDigest *md) { void *RM_LoadDataTypeFromString(const RedisModuleString *str, const moduleType *mt) { rio payload; RedisModuleIO io; + void *ret; rioInitWithBuffer(&payload, str->ptr); moduleInitIOContext(io,(moduleType *)mt,&payload,NULL); @@ -3971,7 +3972,12 @@ void *RM_LoadDataTypeFromString(const RedisModuleString *str, const moduleType * * need to make sure we read the same. */ io.ver = 2; - return mt->rdb_load(&io,0); + ret = mt->rdb_load(&io,0); + if (io.ctx) { + moduleFreeContext(io.ctx); + zfree(io.ctx); + } + return ret; } /* Encode a module data type 'mt' value 'data' into serialized form, and return it @@ -3989,11 +3995,15 @@ RedisModuleString *RM_SaveDataTypeToString(RedisModuleCtx *ctx, void *data, cons rioInitWithBuffer(&payload,sdsempty()); moduleInitIOContext(io,(moduleType *)mt,&payload,NULL); mt->rdb_save(&io,data); + if (io.ctx) { + moduleFreeContext(io.ctx); + zfree(io.ctx); + } if (io.error) { return NULL; } else { robj *str = createObject(OBJ_STRING,payload.io.buffer.ptr); - autoMemoryAdd(ctx,REDISMODULE_AM_STRING,str); + if (ctx != NULL) autoMemoryAdd(ctx,REDISMODULE_AM_STRING,str); return str; } }