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:
authorJoyce Babu <joyce@ennexa.com>2019-04-04 19:15:47 +0300
committerMichael Grunder <michael.grunder@gmail.com>2019-04-04 23:00:27 +0300
commit4c7643ee11670013918d9e002010ddb63b77a4cf (patch)
tree6a8c3d32db38059a349c8df6a01f6326008ba7b5 /redis_commands.c
parent29f507a1e143b1998aea6d4600248ee4501782ea (diff)
Fix TypeError when using built-in constants in `setOption`
In strict_type mode `Redis::setOption` requires the second argument to be of type `string`. This throws a TypeError for some options, even when using built-in constants The type of `value` argument of setOption has been changed to mixed to prevent the error.
Diffstat (limited to 'redis_commands.c')
-rw-r--r--redis_commands.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/redis_commands.c b/redis_commands.c
index 30324b61..95ed8915 100644
--- a/redis_commands.c
+++ b/redis_commands.c
@@ -3868,21 +3868,21 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
{
long val_long;
zend_long option;
- char *val_str;
+ zval *val;
+ zend_string *val_str;
struct timeval read_tv;
- size_t val_len;
int tcp_keepalive = 0;
php_netstream_data_t *sock;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &option,
- &val_str, &val_len) == FAILURE)
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz", &option,
+ &val) == FAILURE)
{
RETURN_FALSE;
}
switch(option) {
case REDIS_OPT_SERIALIZER:
- val_long = atol(val_str);
+ val_long = zval_get_long(val);
if (val_long == REDIS_SERIALIZER_NONE || val_long == REDIS_SERIALIZER_PHP
#ifdef HAVE_REDIS_IGBINARY
|| val_long == REDIS_SERIALIZER_IGBINARY
@@ -3896,7 +3896,7 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
}
break;
case REDIS_OPT_COMPRESSION:
- val_long = atol(val_str);
+ val_long = zval_get_long(val);
if (val_long == REDIS_COMPRESSION_NONE
#ifdef HAVE_REDIS_LZF
|| val_long == REDIS_COMPRESSION_LZF
@@ -3911,12 +3911,15 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
zend_string_release(redis_sock->prefix);
redis_sock->prefix = NULL;
}
- if (val_str && val_len > 0) {
- redis_sock->prefix = zend_string_init(val_str, val_len, 0);
+ val_str = zval_get_string(val);
+ if (ZSTR_LEN(val_str) > 0) {
+ redis_sock->prefix = val_str;
+ } else {
+ zend_string_release(val_str);
}
RETURN_TRUE;
case REDIS_OPT_READ_TIMEOUT:
- redis_sock->read_timeout = atof(val_str);
+ redis_sock->read_timeout = zval_get_double(val);
if (redis_sock->stream) {
read_tv.tv_sec = (time_t)redis_sock->read_timeout;
read_tv.tv_usec = (int)((redis_sock->read_timeout -
@@ -3932,7 +3935,7 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
if (ZSTR_VAL(redis_sock->host)[0] == '/' && redis_sock->port < 1) {
RETURN_FALSE;
}
- tcp_keepalive = atol(val_str) > 0 ? 1 : 0;
+ tcp_keepalive = zval_get_long(val) > 0 ? 1 : 0;
if (redis_sock->tcp_keepalive == tcp_keepalive) {
RETURN_TRUE;
}
@@ -3947,14 +3950,14 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
}
RETURN_TRUE;
case REDIS_OPT_SCAN:
- val_long = atol(val_str);
+ val_long = zval_get_long(val);
if (val_long==REDIS_SCAN_NORETRY || val_long==REDIS_SCAN_RETRY) {
redis_sock->scan = val_long;
RETURN_TRUE;
}
break;
case REDIS_OPT_FAILOVER:
- val_long = atol(val_str);
+ val_long = zval_get_long(val);
if (val_long == REDIS_FAILOVER_NONE ||
val_long == REDIS_FAILOVER_ERROR ||
val_long == REDIS_FAILOVER_DISTRIBUTE ||