Commit a66dd433 authored by Salvatore Sanfilippo's avatar Salvatore Sanfilippo Committed by GitHub
Browse files

Merge pull request #3331 from yossigo/fix_openkey_crash

Fix occasional RM_OpenKey() crashes.
parents 393c4686 e22f3e40
...@@ -163,7 +163,8 @@ void RM_CloseKey(RedisModuleKey *key); ...@@ -163,7 +163,8 @@ void RM_CloseKey(RedisModuleKey *key);
void autoMemoryCollect(RedisModuleCtx *ctx); void autoMemoryCollect(RedisModuleCtx *ctx);
robj **moduleCreateArgvFromUserFormat(const char *cmdname, const char *fmt, int *argcp, int *flags, va_list ap); robj **moduleCreateArgvFromUserFormat(const char *cmdname, const char *fmt, int *argcp, int *flags, va_list ap);
void moduleReplicateMultiIfNeeded(RedisModuleCtx *ctx); void moduleReplicateMultiIfNeeded(RedisModuleCtx *ctx);
void RM_ZsetRangeStop(RedisModuleKey *key); void RM_ZsetRangeStop(RedisModuleKey *kp);
static void zsetKeyReset(RedisModuleKey *key);
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
* Heap allocation raw functions * Heap allocation raw functions
...@@ -1060,7 +1061,7 @@ void *RM_OpenKey(RedisModuleCtx *ctx, robj *keyname, int mode) { ...@@ -1060,7 +1061,7 @@ void *RM_OpenKey(RedisModuleCtx *ctx, robj *keyname, int mode) {
kp->value = value; kp->value = value;
kp->iter = NULL; kp->iter = NULL;
kp->mode = mode; kp->mode = mode;
RM_ZsetRangeStop(kp); zsetKeyReset(kp);
autoMemoryAdd(ctx,REDISMODULE_AM_KEY,kp); autoMemoryAdd(ctx,REDISMODULE_AM_KEY,kp);
return (void*)kp; return (void*)kp;
} }
...@@ -1446,17 +1447,23 @@ int RM_ZsetScore(RedisModuleKey *key, RedisModuleString *ele, double *score) { ...@@ -1446,17 +1447,23 @@ int RM_ZsetScore(RedisModuleKey *key, RedisModuleString *ele, double *score) {
* Key API for Sorted Set iterator * Key API for Sorted Set iterator
* -------------------------------------------------------------------------- */ * -------------------------------------------------------------------------- */
static void zsetKeyReset(RedisModuleKey *key)
{
key->ztype = REDISMODULE_ZSET_RANGE_NONE;
key->zcurrent = NULL;
key->zer = 1;
}
/* Stop a sorted set iteration. */ /* Stop a sorted set iteration. */
void RM_ZsetRangeStop(RedisModuleKey *key) { void RM_ZsetRangeStop(RedisModuleKey *key) {
/* Free resources if needed. */ /* Free resources if needed. */
if (key->ztype == REDISMODULE_ZSET_RANGE_LEX) if (key->ztype == REDISMODULE_ZSET_RANGE_LEX) {
zslFreeLexRange(&key->zlrs); zslFreeLexRange(&key->zlrs);
}
/* Setup sensible values so that misused iteration API calls when an /* Setup sensible values so that misused iteration API calls when an
* iterator is not active will result into something more sensible * iterator is not active will result into something more sensible
* than crashing. */ * than crashing. */
key->ztype = REDISMODULE_ZSET_RANGE_NONE; zsetKeyReset(key);
key->zcurrent = NULL;
key->zer = 1;
} }
/* Return the "End of range" flag value to signal the end of the iteration. */ /* Return the "End of range" flag value to signal the end of the iteration. */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment