diff options
author | Pavlo Yatsukhnenko <yatsukhnenko@gmail.com> | 2018-11-07 18:48:58 +0300 |
---|---|---|
committer | Pavlo Yatsukhnenko <yatsukhnenko@gmail.com> | 2018-11-07 18:48:58 +0300 |
commit | 4e2de1581f93bfaa790eea91afcbf2fca6324037 (patch) | |
tree | 06355e292529735d9cd87c34dc1ce4f3f1dfa5de /redis_session.c | |
parent | 6f7ddd275a008ed0beb995d3f9f80756af02a370 (diff) |
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.
Diffstat (limited to 'redis_session.c')
-rw-r--r-- | redis_session.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/redis_session.c b/redis_session.c index bb62ae8e..6369e134 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); |