From 4e2de1581f93bfaa790eea91afcbf2fca6324037 Mon Sep 17 00:00:00 2001 From: Pavlo Yatsukhnenko Date: Wed, 7 Nov 2018 17:48:58 +0200 Subject: [PATCH] Fix redis_session Prevent infinite loop when redis_sock_server_open failed. Check pool->lock_status.session_key is not NULL in PS_CLOSE_FUNC. --- redis_session.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/redis_session.c b/redis_session.c index bb62ae8..6369e13 100644 --- a/redis_session.c +++ b/redis_session.c @@ -209,17 +209,16 @@ redis_pool_get_sock(redis_pool *pool, const char *key TSRMLS_DC) { if (rpm->auth && rpm->redis_sock->status != REDIS_SOCK_STATUS_CONNECTED) { needs_auth = 1; } - if (redis_sock_server_open(rpm->redis_sock TSRMLS_CC) < 0) { - continue; - } - if (needs_auth) { - redis_pool_member_auth(rpm TSRMLS_CC); - } - if (rpm->database >= 0) { /* default is -1 which leaves the choice to redis. */ - redis_pool_member_select(rpm TSRMLS_CC); - } + if (redis_sock_server_open(rpm->redis_sock TSRMLS_CC) == 0) { + if (needs_auth) { + redis_pool_member_auth(rpm TSRMLS_CC); + } + if (rpm->database >= 0) { /* default is -1 which leaves the choice to redis. */ + redis_pool_member_select(rpm TSRMLS_CC); + } - return rpm; + return rpm; + } } i += rpm->weight; rpm = rpm->next; @@ -546,11 +545,13 @@ PS_CLOSE_FUNC(redis) redis_pool *pool = PS_GET_MOD_DATA(); if (pool) { - redis_pool_member *rpm = redis_pool_get_sock(pool, ZSTR_VAL(pool->lock_status.session_key) TSRMLS_CC); + if (pool->lock_status.session_key) { + redis_pool_member *rpm = redis_pool_get_sock(pool, ZSTR_VAL(pool->lock_status.session_key) TSRMLS_CC); - RedisSock *redis_sock = rpm ? rpm->redis_sock : NULL; - if (redis_sock) { - lock_release(redis_sock, &pool->lock_status TSRMLS_CC); + RedisSock *redis_sock = rpm ? rpm->redis_sock : NULL; + if (redis_sock) { + lock_release(redis_sock, &pool->lock_status TSRMLS_CC); + } } redis_pool_free(pool TSRMLS_CC);