diff --git a/src/module.c b/src/module.c
index f9e0d8036..597be4840 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;
     }
 }