Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavlo Yatsukhnenko <yatsukhnenko@gmail.com>2018-11-07 18:48:58 +0300
committerPavlo Yatsukhnenko <yatsukhnenko@gmail.com>2018-11-07 18:48:58 +0300
commit4e2de1581f93bfaa790eea91afcbf2fca6324037 (patch)
tree06355e292529735d9cd87c34dc1ce4f3f1dfa5de /redis_session.c
parent6f7ddd275a008ed0beb995d3f9f80756af02a370 (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.c29
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);