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.
This commit is contained in:
Shubham S Taple 2026-04-28 14:15:31 +05:30 committed by GitHub
parent 5a05863e97
commit 247307de96
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 5 additions and 5 deletions

View file

@ -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

View file

@ -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;

View file

@ -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;
}