From 74a6c8c7fbc802c89cd5a2e92f01ae489b6ff59e Mon Sep 17 00:00:00 2001 From: Dvir Volk Date: Wed, 23 Aug 2017 17:03:29 +0300 Subject: [PATCH] made RMUtilInfo strdip all its keys and values for saner memory management --- rmutil/util.c | 17 +++++++++++------ rmutil/util.h | 4 ++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/rmutil/util.c b/rmutil/util.c index c6fa831..7fb3220 100644 --- a/rmutil/util.c +++ b/rmutil/util.c @@ -57,9 +57,11 @@ RMUtilInfo *RMUtil_GetRedisInfo(RedisModuleCtx *ctx) { info->entries = calloc(cap, sizeof(RMUtilInfoEntry)); int i = 0; - char *text = (char *)RedisModule_StringPtrLen(RedisModule_CreateStringFromCallReply(r), NULL); + size_t sz; + char *text = (char *)RedisModule_CallReplyStringPtr(r, &sz); + char *line = text; - while (line) { + while (line && line < text + sz) { char *line = strsep(&text, "\r\n"); if (line == NULL) break; @@ -68,8 +70,8 @@ RMUtilInfo *RMUtil_GetRedisInfo(RedisModuleCtx *ctx) { } char *key = strsep(&line, ":"); - info->entries[i].key = key; - info->entries[i].val = line; + info->entries[i].key = strdup(key); + info->entries[i].val = strdup(line); i++; if (i >= cap) { cap *= 2; @@ -77,11 +79,14 @@ RMUtilInfo *RMUtil_GetRedisInfo(RedisModuleCtx *ctx) { } } info->numEntries = i; - + RedisModule_FreeCallReply(r); return info; } void RMUtilRedisInfo_Free(RMUtilInfo *info) { - + for (int i = 0; i < info->numEntries; i++) { + free(info->entries[i].key); + free(info->entries[i].val); + } free(info->entries); free(info); } diff --git a/rmutil/util.h b/rmutil/util.h index b56053a..cc75de6 100644 --- a/rmutil/util.h +++ b/rmutil/util.h @@ -79,8 +79,8 @@ void RMUtil_DefaultAofRewrite(RedisModuleIO *aof, RedisModuleString *key, void * // A single key/value entry in a redis info map typedef struct { - const char *key; - const char *val; + char *key; + char *val; } RMUtilInfoEntry; // Representation of INFO command response, as a list of k/v pairs