Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4c7643e

Browse files
JoyceBabumichael-grunder
authored andcommitted
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.
1 parent 29f507a commit 4c7643e

1 file changed

Lines changed: 15 additions & 12 deletions

File tree

redis_commands.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3868,21 +3868,21 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
38683868
{
38693869
long val_long;
38703870
zend_long option;
3871-
char *val_str;
3871+
zval *val;
3872+
zend_string *val_str;
38723873
struct timeval read_tv;
3873-
size_t val_len;
38743874
int tcp_keepalive = 0;
38753875
php_netstream_data_t *sock;
38763876

3877-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &option,
3878-
&val_str, &val_len) == FAILURE)
3877+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz", &option,
3878+
&val) == FAILURE)
38793879
{
38803880
RETURN_FALSE;
38813881
}
38823882

38833883
switch(option) {
38843884
case REDIS_OPT_SERIALIZER:
3885-
val_long = atol(val_str);
3885+
val_long = zval_get_long(val);
38863886
if (val_long == REDIS_SERIALIZER_NONE || val_long == REDIS_SERIALIZER_PHP
38873887
#ifdef HAVE_REDIS_IGBINARY
38883888
|| val_long == REDIS_SERIALIZER_IGBINARY
@@ -3896,7 +3896,7 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
38963896
}
38973897
break;
38983898
case REDIS_OPT_COMPRESSION:
3899-
val_long = atol(val_str);
3899+
val_long = zval_get_long(val);
39003900
if (val_long == REDIS_COMPRESSION_NONE
39013901
#ifdef HAVE_REDIS_LZF
39023902
|| val_long == REDIS_COMPRESSION_LZF
@@ -3911,12 +3911,15 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
39113911
zend_string_release(redis_sock->prefix);
39123912
redis_sock->prefix = NULL;
39133913
}
3914-
if (val_str && val_len > 0) {
3915-
redis_sock->prefix = zend_string_init(val_str, val_len, 0);
3914+
val_str = zval_get_string(val);
3915+
if (ZSTR_LEN(val_str) > 0) {
3916+
redis_sock->prefix = val_str;
3917+
} else {
3918+
zend_string_release(val_str);
39163919
}
39173920
RETURN_TRUE;
39183921
case REDIS_OPT_READ_TIMEOUT:
3919-
redis_sock->read_timeout = atof(val_str);
3922+
redis_sock->read_timeout = zval_get_double(val);
39203923
if (redis_sock->stream) {
39213924
read_tv.tv_sec = (time_t)redis_sock->read_timeout;
39223925
read_tv.tv_usec = (int)((redis_sock->read_timeout -
@@ -3932,7 +3935,7 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
39323935
if (ZSTR_VAL(redis_sock->host)[0] == '/' && redis_sock->port < 1) {
39333936
RETURN_FALSE;
39343937
}
3935-
tcp_keepalive = atol(val_str) > 0 ? 1 : 0;
3938+
tcp_keepalive = zval_get_long(val) > 0 ? 1 : 0;
39363939
if (redis_sock->tcp_keepalive == tcp_keepalive) {
39373940
RETURN_TRUE;
39383941
}
@@ -3947,14 +3950,14 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
39473950
}
39483951
RETURN_TRUE;
39493952
case REDIS_OPT_SCAN:
3950-
val_long = atol(val_str);
3953+
val_long = zval_get_long(val);
39513954
if (val_long==REDIS_SCAN_NORETRY || val_long==REDIS_SCAN_RETRY) {
39523955
redis_sock->scan = val_long;
39533956
RETURN_TRUE;
39543957
}
39553958
break;
39563959
case REDIS_OPT_FAILOVER:
3957-
val_long = atol(val_str);
3960+
val_long = zval_get_long(val);
39583961
if (val_long == REDIS_FAILOVER_NONE ||
39593962
val_long == REDIS_FAILOVER_ERROR ||
39603963
val_long == REDIS_FAILOVER_DISTRIBUTE ||

0 commit comments

Comments
 (0)