• antirez's avatar
    Scripting: Reset Lua fake client reply_bytes after command execution. · 42a239b8
    antirez authored
    Lua scripting uses a fake client in order to run commands in the context
    of a client, accumulate the reply, and convert it into a Lua object
    to return to the caller. This client is reused again and again, and is
    referenced by the server.lua_client globally accessible pointer.
    
    However after every call to redis.call() or redis.pcall(), that is
    handled by the luaRedisGenericCommand() function, the reply_bytes field
    of the client was not set back to zero. This filed is used to estimate
    the amount of memory currently used in the reply. Because of the lack of
    reset, script after script executed, this value used to get bigger and
    bigger, and in the end on 32 bit systems it triggered the following
    assert:
    
        redisAssert(c->reply_bytes < ULONG_MAX-(1024*64));
    
    On 64 bit systems this does not happen because it takes too much time to
    reach values near to 2^64 for users to see the practical effect of the
    bug.
    
    Now in the cleanup stage of luaRedisGenericCommand() we reset the
    reply_bytes counter to zero, avoiding the issue. It is not practical to
    add a test for this bug, but the fix was manually tested using a
    debugger.
    
    This commit fixes issue #656.
    42a239b8
scripting.c 32.4 KB