diff --git a/.travis.yml b/.travis.yml index d529cf50..04f90cec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,7 @@ language: php php: - - 5.5 - #- 5.4 - #- 5.3 + - 7.0 + env: - LIBMEMCACHED_VERSION=1.0.17 - LIBMEMCACHED_VERSION=1.0.16 diff --git a/.travis/travis.sh b/.travis/travis.sh index f90cae9f..04f2603a 100755 --- a/.travis/travis.sh +++ b/.travis/travis.sh @@ -128,8 +128,9 @@ function build_php_memcached() { sasl_flag="--enable-memcached-sasl" fi - ./configure --with-libmemcached-dir="$LIBMEMCACHED_PREFIX" $protocol_flag $sasl_flag --enable-memcached-json --enable-memcached-igbinary --enable-memcached-msgpack - make + # ./configure --with-libmemcached-dir="$LIBMEMCACHED_PREFIX" $protocol_flag $sasl_flag --enable-memcached-json --enable-memcached-igbinary --enable-memcached-msgpack + ./configure --with-libmemcached-dir="$LIBMEMCACHED_PREFIX" $protocol_flag $sasl_flag + make make install popd } @@ -155,11 +156,11 @@ function run_memcached_tests() { pushd "${PHP_MEMCACHED_BUILD_DIR}/memcached-${PHP_MEMCACHED_VERSION}" # We have one xfail test, we run it separately - php run-tests.php -d extension=msgpack.so -d extension=igbinary.so -d extension=memcached.so -n ./tests/expire.phpt + php run-tests.php -d extension=memcached.so -n ./tests/expire.phpt rm ./tests/expire.phpt # Run normal tests - php run-tests.php -d extension=msgpack.so -d extension=igbinary.so -d extension=memcached.so -n ./tests/*.phpt + php run-tests.php -d extension=memcached.so -n ./tests/*.phpt retval=$? for i in `ls tests/*.out 2>/dev/null`; do echo "-- START ${i}"; @@ -213,14 +214,14 @@ case $ACTION in install_libmemcached # Install igbinary extension - install_igbinary + # install_igbinary # install msgpack - install_msgpack + # install_msgpack # install SASL if test "x$ENABLE_SASL" = "xyes"; then - install_sasl + install_sasl fi ;; diff --git a/php_memcached.c b/php_memcached.c index 9195bfcd..926db8a4 100644 --- a/php_memcached.c +++ b/php_memcached.c @@ -170,7 +170,7 @@ typedef struct { } php_memc_t; static inline php_memc_t *php_memc_fetch_object(zend_object *obj) { - return (php_memc_t *)((char *)(obj) - XtOffsetOf(php_memc_t, zo)); + return (php_memc_t *)((char *)obj - XtOffsetOf(php_memc_t, zo)); } #define Z_MEMC_OBJ_P(zv) php_memc_fetch_object(Z_OBJ_P(zv)); @@ -356,20 +356,17 @@ char *php_memc_printable_func (zend_fcall_info *fci, zend_fcall_info_cache *fci_ static zend_bool php_memcached_on_new_callback(zval *object, zend_fcall_info *fci, zend_fcall_info_cache *fci_cache, zend_string *persistent_id) { zend_bool ret = 1; - zval retval; - zval params[2]; + zval retval, id; if (persistent_id) { - ZVAL_STR(¶ms[1], persistent_id); + ZVAL_STR(&id, persistent_id); } else { - ZVAL_NULL(¶ms[1]); + ZVAL_NULL(&id); } - /* Call the cb */ - ZVAL_COPY(¶ms[0], object); + ZVAL_UNDEF(&retval); - fci->params = params; - fci->param_count = 2; + zend_fcall_info_argn(fci, 2, object, &id); fci->retval = &retval; fci->no_separation = 1; @@ -379,10 +376,12 @@ static zend_bool php_memcached_on_new_callback(zval *object, zend_fcall_info *fc efree (buf); ret = 0; } + + if (Z_TYPE(retval) != IS_UNDEF) + zval_ptr_dtor(&retval); + + zend_fcall_info_args_clear(fci, 1); - zval_ptr_dtor(¶ms[0]); - zval_ptr_dtor(¶ms[1]); - zval_ptr_dtor(&retval); return ret; } @@ -407,7 +406,7 @@ static PHP_METHOD(Memcached, __construct) zend_fcall_info fci = {0}; zend_fcall_info_cache fci_cache; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "|S!f!S", &persistent_id, &fci, &fci_cache, &conn_str) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|S!f!S", &persistent_id, &fci, &fci_cache, &conn_str) == FAILURE) { return; } @@ -3295,6 +3294,7 @@ zend_bool s_unserialize_value (enum memcached_serializer serializer, int val_typ PHP_VAR_UNSERIALIZE_INIT(var_hash); if (!php_var_unserialize(value, (const unsigned char **)&payload_tmp, (const unsigned char *)payload_tmp + payload_len, &var_hash)) { + zval_ptr_dtor(value); ZVAL_FALSE(value); PHP_VAR_UNSERIALIZE_DESTROY(var_hash); php_error_docref(NULL, E_WARNING, "could not unserialize value"); @@ -3529,6 +3529,7 @@ static memcached_return php_memc_do_cache_callback(zval *zmemc_obj, zend_fcall_i fci->param_count = 4; result = zend_call_function(fci, fcc); + ZVAL_DUP(value, Z_REFVAL(z_val)); expiration = Z_REFVAL(z_expiration); if (result == SUCCESS && Z_TYPE(retval) != IS_UNDEF) { @@ -3573,6 +3574,7 @@ static memcached_return php_memc_do_cache_callback(zval *zmemc_obj, zend_fcall_i zval_ptr_dtor(&z_key); zval_ptr_dtor(&z_val); zval_ptr_dtor(&z_expiration); + zval_ptr_dtor(zmemc_obj); return status; } @@ -3594,9 +3596,7 @@ static int php_memc_do_result_callback(zval *zmemc_obj, zend_fcall_info *fci, int rc = 0; php_memc_t *i_obj = NULL; - ZVAL_COPY(¶ms[0], zmemc_obj); fci->retval = &retval; - fci->params = params; fci->param_count = 2; payload = memcached_result_value(result); @@ -3615,7 +3615,6 @@ static int php_memc_do_result_callback(zval *zmemc_obj, zend_fcall_info *fci, } array_init(&z_result); - ZVAL_COPY(¶ms[1], &z_result); add_assoc_stringl_ex(&z_result, ZEND_STRL("key"), (char *)res_key, res_key_len); add_assoc_zval_ex(&z_result, ZEND_STRL("value"), &value); if (cas != 0) { @@ -3625,16 +3624,19 @@ static int php_memc_do_result_callback(zval *zmemc_obj, zend_fcall_info *fci, add_assoc_long_ex(&z_result, ZEND_STRL("flags"), MEMC_VAL_GET_USER_FLAGS(flags)); } + ZVAL_UNDEF(&retval); + zend_fcall_info_argn(fci, 2, zmemc_obj, &z_result); + if (zend_call_function(fci, fcc) == FAILURE) { php_error_docref(NULL, E_WARNING, "could not invoke result callback"); rc = -1; } - if (&retval) { + if (Z_TYPE(retval) != IS_UNDEF) { zval_ptr_dtor(&retval); } - zval_ptr_dtor(¶ms[0]); - zval_ptr_dtor(¶ms[1]); + + zend_fcall_info_args_clear(fci, 1); zval_ptr_dtor(&z_result); return rc; diff --git a/tests/bad_construct.phpt b/tests/bad_construct.phpt index 06bc7236..ab3079cf 100644 --- a/tests/bad_construct.phpt +++ b/tests/bad_construct.phpt @@ -4,7 +4,7 @@ Memcached construct with bad arguments --FILE-- setOption (Memcached::OPT_BINARY_PROTOCOL, true)); echo "OK" . PHP_EOL; --EXPECTF-- -Memcached::__construct() expects parameter %s -NULL +Warning: Memcached::__construct() expects parameter 1 to be string, object given in %s on line 3 +Memcached::__construct() expects parameter 1 to be string, object given +object(Memcached)#1 (0) { +} -Warning: Memcached::setOption(): Memcached constructor was not called in %s on line %d +Warning: Memcached::setOption(): Memcached constructor was not called in %s on line 14 NULL -OK \ No newline at end of file +OK + diff --git a/tests/clone.phpt b/tests/clone.phpt index a0c49cd7..0b41c50c 100644 --- a/tests/clone.phpt +++ b/tests/clone.phpt @@ -12,4 +12,7 @@ $m = clone $m; echo "GOT HERE"; --EXPECTF-- -Fatal error: Trying to clone an uncloneable object of class Memcached in %s on line %d \ No newline at end of file +Fatal error: Uncaught Error: Trying to clone an uncloneable object of class Memcached in %s:6 +Stack trace: +#0 {main} + thrown in %s on line 6 diff --git a/tests/experimental/cas_invalid_key.phpt b/tests/experimental/cas_invalid_key.phpt index c01d2c8d..3a69e40e 100644 --- a/tests/experimental/cas_invalid_key.phpt +++ b/tests/experimental/cas_invalid_key.phpt @@ -11,11 +11,11 @@ error_reporting(0); var_dump($m->cas(0, '', true, 10)); echo $m->getResultMessage(), "\n"; -var_dump($m->cas(0, ' �� jas kjjhask d ', true, 10)); +var_dump($m->cas(0, ' �� jas kjjhask d ', true, 10)); # no spaces allowed echo $m->getResultMessage(), "\n"; --EXPECTF-- bool(false) A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE bool(false) -%rCLIENT ERROR|NOT FOUND%r +A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE diff --git a/tests/experimental/delete_bykey.phpt b/tests/experimental/delete_bykey.phpt index 87219539..9a198f15 100644 --- a/tests/experimental/delete_bykey.phpt +++ b/tests/experimental/delete_bykey.phpt @@ -21,7 +21,7 @@ var_dump($m->deleteByKey('keffe', '')); echo $m->getResultMessage(), "\n"; var_dump($m->deleteByKey('', 'keffe')); echo $m->getResultMessage(), "\n"; -var_dump($m->deleteByKey('keffe', '���as�� �a�sd�f asdf')); +var_dump($m->deleteByKey('keffe', '���as�� �a�sd�f asdf')); # no spaces allowed echo $m->getResultMessage(), "\n"; --EXPECTF-- string(3) "foo" @@ -37,4 +37,4 @@ A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE bool(false) NOT FOUND bool(false) -%rPROTOCOL ERROR|NOT FOUND|WRITE FAILURE|CLIENT ERROR%r +A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE diff --git a/tests/experimental/get.phpt b/tests/experimental/get.phpt index 34537fc4..67e0b8f3 100644 --- a/tests/experimental/get.phpt +++ b/tests/experimental/get.phpt @@ -30,4 +30,4 @@ A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE string(4) "asdf" SUCCESS bool(false) -NOT FOUND +A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE diff --git a/tests/experimental/get_bykey_cas.phpt b/tests/experimental/get_bykey_cas.phpt index ad94013e..6990927b 100644 --- a/tests/experimental/get_bykey_cas.phpt +++ b/tests/experimental/get_bykey_cas.phpt @@ -59,7 +59,7 @@ string(4) "asdf" float(%d) SUCCESS bool(false) -NULL +float(0) NOT FOUND bool(false) NULL