From 247307de96f74e24bb02b2876a213256f92893e7 Mon Sep 17 00:00:00 2001 From: Shubham S Taple <155555100+ShubhamTaple@users.noreply.github.com> Date: Tue, 28 Apr 2026 14:15:31 +0530 Subject: [PATCH] Pass context to RM_GetUserUsername() to support auto memory management (#15042) Following #14890 ## Problem RM_GetUserUsername() documents that the returned RedisModuleString can be freed via automatic memory management, but it always creates the string with ctx=NULL so it cannot be tracked by RedisModule_AutoMemory. Modules following the documentation may leak memory. ## Fix Fixes `RedisModule_GetUserUsername` to accept a `RedisModuleCtx *` and create the returned `RedisModuleString` with that context, allowing RedisModule auto-memory management to track/free it as documented. --- src/module.c | 4 ++-- src/redismodule.h | 2 +- tests/modules/usercall.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/module.c b/src/module.c index cb9edd67e..548aa02f0 100644 --- a/src/module.c +++ b/src/module.c @@ -10480,11 +10480,11 @@ int RM_FreeModuleUser(RedisModuleUser *user) { * Returns NULL if user is NULL or the user has no name. * The returned string must be freed by the caller with RedisModule_FreeString() * or by enabling automatic memory management on a context. */ - RedisModuleString *RM_GetUserUsername(const RedisModuleUser *user) { + RedisModuleString *RM_GetUserUsername(RedisModuleCtx *ctx, const RedisModuleUser *user) { if(user == NULL || user->user == NULL || user->user->name == NULL) return NULL; - return RM_CreateString(NULL, user->user->name, sdslen(user->user->name)); + return RM_CreateString(ctx, user->user->name, sdslen(user->user->name)); } /* Sets the permissions of a user created through the redis module diff --git a/src/redismodule.h b/src/redismodule.h index 56e3d4f91..fae09c3fb 100644 --- a/src/redismodule.h +++ b/src/redismodule.h @@ -1426,7 +1426,7 @@ REDISMODULE_API RedisModuleUser * (*RedisModule_CreateModuleUser)(const char *na REDISMODULE_API void (*RedisModule_FreeModuleUser)(RedisModuleUser *user) REDISMODULE_ATTR; REDISMODULE_API void (*RedisModule_SetContextUser)(RedisModuleCtx *ctx, const RedisModuleUser *user) REDISMODULE_ATTR; REDISMODULE_API const RedisModuleUser *(*RedisModule_GetContextUser)(RedisModuleCtx *ctx) REDISMODULE_ATTR; -REDISMODULE_API RedisModuleString *(*RedisModule_GetUserUsername)(const RedisModuleUser *user) REDISMODULE_ATTR; +REDISMODULE_API RedisModuleString *(*RedisModule_GetUserUsername)(RedisModuleCtx *ctx, const RedisModuleUser *user) REDISMODULE_ATTR; REDISMODULE_API int (*RedisModule_SetModuleUserACL)(RedisModuleUser *user, const char* acl) REDISMODULE_ATTR; REDISMODULE_API int (*RedisModule_SetModuleUserACLString)(RedisModuleCtx * ctx, RedisModuleUser *user, const char* acl, RedisModuleString **error) REDISMODULE_ATTR; REDISMODULE_API RedisModuleString * (*RedisModule_GetModuleUserACLString)(RedisModuleUser *user) REDISMODULE_ATTR; diff --git a/tests/modules/usercall.c b/tests/modules/usercall.c index 5bb88084a..dd013af08 100644 --- a/tests/modules/usercall.c +++ b/tests/modules/usercall.c @@ -119,13 +119,13 @@ int get_user_username(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { RedisModule_ReplyWithSimpleString(ctx, "none"); return REDISMODULE_OK; } - RedisModuleString *name = RedisModule_GetUserUsername(user); + RedisModuleString *name = RedisModule_GetUserUsername(ctx, user); if (name == NULL) { RedisModule_ReplyWithSimpleString(ctx, "none"); return REDISMODULE_OK; } RedisModule_ReplyWithString(ctx, name); - RedisModule_FreeString(NULL, name); + RedisModule_FreeString(ctx, name); return REDISMODULE_OK; }