From aa6201e6ab2642cb053909825a29cae6ac48c0ed Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 28 Apr 2015 22:10:23 +0200 Subject: [PATCH] Fix Sentinel memory leak (hiredis bug) This fixes issue #2535, that was actually an hiredis library bug (I submitted an issue and fix to the redis/hiredis repo as well). When an asynchronous hiredis connection subscribes to a Pub/Sub channel and gets an error, and in other related conditions, the function redisProcessCallbacks() enters a code path where the link is disconnected, however the function returns before freeing the allocated reply object. This causes a memory leak. The memory leak was trivial to trigger in Redis Sentinel, which uses hiredis, every time we tried to subscribe to an instance that required a password, in case the Sentinel was configured either with the wrong password or without password at all. In this case, the -AUTH error caused the leaking code path to be executed. It was verified with Valgrind that after this change the leak no longer happens in Sentinel with a misconfigured authentication password. --- deps/hiredis/async.c | 1 + 1 file changed, 1 insertion(+) diff --git a/deps/hiredis/async.c b/deps/hiredis/async.c index f7f343bef..9cc35638f 100644 --- a/deps/hiredis/async.c +++ b/deps/hiredis/async.c @@ -443,6 +443,7 @@ void redisProcessCallbacks(redisAsyncContext *ac) { if (((redisReply*)reply)->type == REDIS_REPLY_ERROR) { c->err = REDIS_ERR_OTHER; snprintf(c->errstr,sizeof(c->errstr),"%s",((redisReply*)reply)->str); + c->reader->fn->freeObject(reply); __redisAsyncDisconnect(ac); return; }