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>2019-02-27 16:23:25 +0300
committermichael-grunder <michael.grunder@gmail.com>2019-03-19 21:28:00 +0300
commit112c77e3a1967ff7c655fd8fcc283d4b4888a5e6 (patch)
tree9fcaef1fb6217226cc7875ce828f694b8f2a0243 /redis_array.c
parent85419ce7d370dca4d81e9426363ca0ae65c93439 (diff)
Issue #1508
Wrap all calls of `call_user_function` into `ra_call_user_function` where AUTH command sended before function call.
Diffstat (limited to 'redis_array.c')
-rw-r--r--redis_array.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/redis_array.c b/redis_array.c
index 37b31484..c332f6fc 100644
--- a/redis_array.c
+++ b/redis_array.c
@@ -222,6 +222,19 @@ redis_array_get(zval *id TSRMLS_DC)
return NULL;
}
+PHP_REDIS_API int
+ra_call_user_function(HashTable *function_table, zval *object, zval *function_name, zval *retval_ptr, uint param_count, zval params[] TSRMLS_DC)
+{
+ if (object) {
+ redis_object *redis = PHPREDIS_GET_OBJECT(redis_object, object);
+ if (redis->sock->auth && redis->sock->status != REDIS_SOCK_STATUS_CONNECTED) {
+ redis_sock_server_open(redis->sock TSRMLS_CC);
+ redis_sock_auth(redis->sock TSRMLS_CC);
+ }
+ }
+ return call_user_function(function_table, object, function_name, retval_ptr, param_count, params);
+}
+
/* {{{ proto RedisArray RedisArray::__construct()
Public constructor */
PHP_METHOD(RedisArray, __construct)
@@ -398,7 +411,7 @@ ra_forward_call(INTERNAL_FUNCTION_PARAMETERS, RedisArray *ra, const char *cmd, i
/* multi/exec */
if(ra->z_multi_exec) {
- call_user_function(&redis_ce->function_table, ra->z_multi_exec, &z_fun, return_value, argc, z_callargs);
+ ra_call_user_function(&redis_ce->function_table, ra->z_multi_exec, &z_fun, return_value, argc, z_callargs TSRMLS_CC);
zval_dtor(return_value);
zval_dtor(&z_fun);
for (i = 0; i < argc; ++i) {
@@ -416,7 +429,7 @@ ra_forward_call(INTERNAL_FUNCTION_PARAMETERS, RedisArray *ra, const char *cmd, i
/* add MULTI + SADD */
ra_index_multi(redis_inst, MULTI TSRMLS_CC);
/* call using discarded temp value and extract exec results after. */
- call_user_function(&redis_ce->function_table, redis_inst, &z_fun, return_value, argc, z_callargs);
+ ra_call_user_function(&redis_ce->function_table, redis_inst, &z_fun, return_value, argc, z_callargs TSRMLS_CC);
zval_dtor(return_value);
/* add keys to index. */
@@ -425,7 +438,7 @@ ra_forward_call(INTERNAL_FUNCTION_PARAMETERS, RedisArray *ra, const char *cmd, i
/* call EXEC */
ra_index_exec(redis_inst, return_value, 0 TSRMLS_CC);
} else { /* call directly through. */
- call_user_function(&redis_ce->function_table, redis_inst, &z_fun, return_value, argc, z_callargs);
+ ra_call_user_function(&redis_ce->function_table, redis_inst, &z_fun, return_value, argc, z_callargs TSRMLS_CC);
if (!b_write_cmd) {
/* check if we have an error. */
@@ -634,7 +647,7 @@ PHP_METHOD(RedisArray, _continuum)
static void
multihost_distribute_call(RedisArray *ra, zval *return_value, zval *z_fun, int argc, zval *argv TSRMLS_DC)
{
- zval z_arg;
+ zval z_arg, z_tmp;
int i;
/* Init our array return */
@@ -643,7 +656,7 @@ multihost_distribute_call(RedisArray *ra, zval *return_value, zval *z_fun, int a
/* Iterate our RedisArray nodes */
for (i = 0; i < ra->count; ++i) {
/* Call each node in turn */
- call_user_function(&redis_array_ce->function_table, &ra->redis[i], z_fun, &z_arg, argc, argv);
+ ra_call_user_function(&redis_array_ce->function_table, &ra->redis[i], z_fun, &z_tmp, argc, argv TSRMLS_CC);
/* Add the result for this host */
add_assoc_zval_ex(return_value, ZSTR_VAL(ra->hosts[i]), ZSTR_LEN(ra->hosts[i]), &z_arg);
@@ -953,7 +966,7 @@ PHP_METHOD(RedisArray, mget)
/* prepare call */
ZVAL_STRINGL(&z_fun, "MGET", 4);
/* call MGET on the node */
- call_user_function(&redis_ce->function_table, &ra->redis[n], &z_fun, &z_ret, 1, &z_argarray);
+ ra_call_user_function(&redis_ce->function_table, &ra->redis[n], &z_fun, &z_ret, 1, &z_argarray TSRMLS_CC);
zval_dtor(&z_fun);
/* cleanup args array */
@@ -1097,7 +1110,7 @@ PHP_METHOD(RedisArray, mset)
ZVAL_STRINGL(&z_fun, "MSET", 4);
/* call */
- call_user_function(&redis_ce->function_table, &ra->redis[n], &z_fun, &z_ret, 1, &z_argarray);
+ ra_call_user_function(&redis_ce->function_table, &ra->redis[n], &z_fun, &z_ret, 1, &z_argarray TSRMLS_CC);
zval_dtor(&z_fun);
zval_dtor(&z_ret);
@@ -1229,7 +1242,7 @@ static void ra_generic_del(INTERNAL_FUNCTION_PARAMETERS, char *kw, int kw_len) {
}
/* call */
- call_user_function(&redis_ce->function_table, &ra->redis[n], &z_fun, &z_ret, 1, &z_argarray);
+ ra_call_user_function(&redis_ce->function_table, &ra->redis[n], &z_fun, &z_ret, 1, &z_argarray TSRMLS_CC);
if(ra->index) {
zval_dtor(&z_ret);