1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-12-12 03:00:28 +00:00

Fix build with PHP 8.0

Obtained from:	2a5de3c5d9
		7889bd1d23
		e090f05a05
This commit is contained in:
Sunpoet Po-Chuan Hsieh 2020-11-08 17:18:20 +00:00
parent 12c0301cc0
commit a8a13ad422
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=554521

View File

@ -0,0 +1,938 @@
Obtained from: https://github.com/websupport-sk/pecl-memcache/commit/2a5de3c5d9c0bd0acbcf7e6e0b7570f15f89f55b
https://github.com/websupport-sk/pecl-memcache/commit/7889bd1d2359874d7c6c395589d8fee529976984
https://github.com/websupport-sk/pecl-memcache/commit/e090f05a05e4b773f750025a7647f5d590aa4a6a
--- php7/memcache.c.orig 2019-12-20 23:07:05.000000000 +0800
+++ php7/memcache.c 2020-10-16 15:52:01.000000000 +0800
@@ -38,80 +38,341 @@
/* {{{ memcache_functions[]
*/
-ZEND_BEGIN_ARG_INFO(arginfo_memcache_get, 1)
- ZEND_ARG_PASS_INFO(0)
- ZEND_ARG_PASS_INFO(0)
- ZEND_ARG_PASS_INFO(1)
- ZEND_ARG_PASS_INFO(1)
+
+#ifndef ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX
+#define ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(name, ref, num, type) \
+ ZEND_BEGIN_ARG_INFO_EX(name, 0u, ref, num)
+#endif
+
+#ifndef ZEND_ARG_TYPE_MASK
+#define ZEND_ARG_TYPE_MASK(ref, name, mask, def) \
+ ZEND_ARG_INFO(ref, name)
+#endif
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_memcache_connect, 0, 0, 1)
+ ZEND_ARG_INFO(0, host)
+ ZEND_ARG_INFO(0, port)
+ ZEND_ARG_INFO(0, timeout)
+ ZEND_ARG_INFO(0, unused4)
+ ZEND_ARG_INFO(0, unused5)
+ ZEND_ARG_INFO(0, unused6)
+ ZEND_ARG_INFO(0, unused7)
+ ZEND_ARG_INFO(0, unugsed8)
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_INFO(arginfo_memcache_object_get, 1)
- ZEND_ARG_PASS_INFO(0)
- ZEND_ARG_PASS_INFO(1)
- ZEND_ARG_PASS_INFO(1)
+#define arginfo_memcache_pconnect arginfo_memcache_connect
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_add_server, 0, 2, _IS_BOOL, 0)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ ZEND_ARG_INFO(0, host)
+ ZEND_ARG_INFO(0, port)
+ ZEND_ARG_INFO(0, tcp_port)
+ ZEND_ARG_INFO(0, persistent)
+ ZEND_ARG_INFO(0, weight)
+ ZEND_ARG_INFO(0, timeout)
+ ZEND_ARG_INFO(0, retry_interval)
+ ZEND_ARG_INFO(0, status)
+ ZEND_ARG_INFO(0, failure_callback)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_set_server_params, 0, 2, _IS_BOOL, 0)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ ZEND_ARG_TYPE_INFO(0, host, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO(0, tcp_port, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, timeout, IS_DOUBLE, 0)
+ ZEND_ARG_TYPE_INFO(0, retry_interval, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, status, _IS_BOOL, 0)
+ ZEND_ARG_INFO(0, failure_callback)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_set_failure_callback, 0, 2, _IS_BOOL, 0)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ ZEND_ARG_TYPE_INFO(0, failure_callback, IS_CALLABLE, 1)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_memcache_get_server_status, 0, 2, MAY_BE_BOOL|MAY_BE_LONG)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ ZEND_ARG_TYPE_INFO(0, host, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO(0, tcp_port, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_memcache_get_version, 0, 1, MAY_BE_STRING|MAY_BE_BOOL)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_add, 0, 2, _IS_BOOL, 0)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ ZEND_ARG_TYPE_MASK(0, key, MAY_BE_STRING|MAY_BE_ARRAY, 0)
+#ifdef IS_MIXED
+ ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
+#else
+ ZEND_ARG_INFO(0, value)
+#endif
+ ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, exptime, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, cas, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_memcache_set arginfo_memcache_add
+#define arginfo_memcache_replace arginfo_memcache_add
+#define arginfo_memcache_cas arginfo_memcache_add
+#define arginfo_memcache_append arginfo_memcache_add
+#define arginfo_memcache_prepend arginfo_memcache_add
+
+#ifdef IS_MIXED
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_get, 0, 2, IS_MIXED, 0)
+#else
+ZEND_BEGIN_ARG_INFO_EX(arginfo_memcache_get, 0, 0, 1)
+#endif
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ ZEND_ARG_INFO(0, key)
+ ZEND_ARG_INFO(1, flags)
+ ZEND_ARG_INFO(1, cas)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_memcache_delete, 0, 2, MAY_BE_BOOL|MAY_BE_ARRAY)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ ZEND_ARG_INFO(0, key)
+ ZEND_ARG_INFO(0, exptime)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_debug, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_INFO(0, on_off)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_memcache_get_stats, 0, 1, MAY_BE_BOOL|MAY_BE_ARRAY)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ ZEND_ARG_TYPE_INFO(0, type, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO(0, slabid, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, limit, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_memcache_get_extended_stats arginfo_memcache_get_stats
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_set_compress_threshold, 0, 2, _IS_BOOL, 0)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ ZEND_ARG_TYPE_INFO(0, threshold, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, min_savings, IS_DOUBLE, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_memcache_increment, 0, 2, MAY_BE_BOOL|MAY_BE_ARRAY|MAY_BE_LONG)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ ZEND_ARG_TYPE_MASK(0, key, MAY_BE_STRING|MAY_BE_ARRAY, 0)
+ ZEND_ARG_TYPE_INFO(0, value, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, defval, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, exptime, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_memcache_decrement arginfo_memcache_increment
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_close, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_flush, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ ZEND_ARG_TYPE_INFO(0, delay, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_set_sasl_auth_data, 0, 3, _IS_BOOL, 0)
+ ZEND_ARG_OBJ_INFO(0, memcache, MemcachePool, 0)
+ ZEND_ARG_TYPE_INFO(0, username, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO(0, password, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
zend_function_entry memcache_functions[] = {
- PHP_FE(memcache_connect, NULL)
- PHP_FE(memcache_pconnect, NULL)
- PHP_FE(memcache_add_server, NULL)
- PHP_FE(memcache_set_server_params, NULL)
- PHP_FE(memcache_set_failure_callback, NULL)
- PHP_FE(memcache_get_server_status, NULL)
- PHP_FE(memcache_get_version, NULL)
- PHP_FE(memcache_add, NULL)
- PHP_FE(memcache_set, NULL)
- PHP_FE(memcache_replace, NULL)
- PHP_FE(memcache_cas, NULL)
- PHP_FE(memcache_append, NULL)
- PHP_FE(memcache_prepend, NULL)
+ PHP_FE(memcache_connect, arginfo_memcache_connect)
+ PHP_FE(memcache_pconnect, arginfo_memcache_pconnect)
+ PHP_FE(memcache_add_server, arginfo_memcache_add_server)
+ PHP_FE(memcache_set_server_params, arginfo_memcache_set_server_params)
+ PHP_FE(memcache_set_failure_callback, arginfo_memcache_set_failure_callback)
+ PHP_FE(memcache_get_server_status, arginfo_memcache_get_server_status)
+ PHP_FE(memcache_get_version, arginfo_memcache_get_version)
+ PHP_FE(memcache_add, arginfo_memcache_add)
+ PHP_FE(memcache_set, arginfo_memcache_set)
+ PHP_FE(memcache_replace, arginfo_memcache_replace)
+ PHP_FE(memcache_cas, arginfo_memcache_cas)
+ PHP_FE(memcache_append, arginfo_memcache_append)
+ PHP_FE(memcache_prepend, arginfo_memcache_prepend)
PHP_FE(memcache_get, arginfo_memcache_get)
- PHP_FE(memcache_delete, NULL)
- PHP_FE(memcache_debug, NULL)
- PHP_FE(memcache_get_stats, NULL)
- PHP_FE(memcache_get_extended_stats, NULL)
- PHP_FE(memcache_set_compress_threshold, NULL)
- PHP_FE(memcache_increment, NULL)
- PHP_FE(memcache_decrement, NULL)
- PHP_FE(memcache_close, NULL)
- PHP_FE(memcache_flush, NULL)
- PHP_FE(memcache_set_sasl_auth_data, NULL)
- {NULL, NULL, NULL}
+ PHP_FE(memcache_delete, arginfo_memcache_delete)
+ PHP_FE(memcache_debug, arginfo_memcache_debug)
+ PHP_FE(memcache_get_stats, arginfo_memcache_get_stats)
+ PHP_FE(memcache_get_extended_stats, arginfo_memcache_get_extended_stats)
+ PHP_FE(memcache_set_compress_threshold, arginfo_memcache_set_compress_threshold)
+ PHP_FE(memcache_increment, arginfo_memcache_increment)
+ PHP_FE(memcache_decrement, arginfo_memcache_decrement)
+ PHP_FE(memcache_close, arginfo_memcache_close)
+ PHP_FE(memcache_flush, arginfo_memcache_flush)
+ PHP_FE(memcache_set_sasl_auth_data, arginfo_memcache_set_sasl_auth_data)
+ ZEND_FE_END
};
+ZEND_BEGIN_ARG_INFO_EX(arginfo_memcache_pool_object_connect, 0, 0, 1)
+ ZEND_ARG_INFO(0, host)
+ ZEND_ARG_INFO(0, tcp_port)
+ ZEND_ARG_INFO(0, udp_port)
+ ZEND_ARG_INFO(0, persistent)
+ ZEND_ARG_INFO(0, weight)
+ ZEND_ARG_INFO(0, timeout)
+ ZEND_ARG_INFO(0, retry_interval)
+ZEND_END_ARG_INFO()
+
+#define arginfo_memcache_object_connect arginfo_memcache_connect
+#define arginfo_memcache_object_pconnect arginfo_memcache_connect
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_pool_object_addserver, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_INFO(0, host)
+ ZEND_ARG_INFO(0, tcp_port)
+ ZEND_ARG_INFO(0, udp_port)
+ ZEND_ARG_INFO(0, persistent)
+ ZEND_ARG_INFO(0, weight)
+ ZEND_ARG_INFO(0, timeout)
+ ZEND_ARG_INFO(0, retry_interval)
+ ZEND_ARG_INFO(0, status)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_object_addserver, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_INFO(0, host)
+ ZEND_ARG_INFO(0, tcp_port)
+ ZEND_ARG_INFO(0, persistent)
+ ZEND_ARG_INFO(0, weight)
+ ZEND_ARG_INFO(0, timeout)
+ ZEND_ARG_INFO(0, retry_interval)
+ ZEND_ARG_INFO(0, status)
+ ZEND_ARG_INFO(0, failure_callback)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_object_setserverparams, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_TYPE_INFO(0, host, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO(0, tcp_port, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, timeout, IS_DOUBLE, 0)
+ ZEND_ARG_TYPE_INFO(0, retry_interval, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, status, _IS_BOOL, 0)
+ ZEND_ARG_INFO(0, failure_callback)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_object_setfailurecallback, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_TYPE_INFO(0, failure_callback, IS_CALLABLE, 1)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_memcache_object_getserverstatus, 0, 1, MAY_BE_BOOL|MAY_BE_LONG)
+ ZEND_ARG_TYPE_INFO(0, host, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO(0, tcp_port, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_memcache_object_findserver, 0, 1, MAY_BE_STRING|MAY_BE_BOOL)
+ ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_memcache_object_getversion, 0, 0, MAY_BE_STRING|MAY_BE_BOOL)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_object_add, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_TYPE_MASK(0, key, MAY_BE_STRING|MAY_BE_ARRAY, 0)
+#ifdef IS_MIXED
+ ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
+#else
+ ZEND_ARG_INFO(0, value)
+#endif
+ ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, exptime, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, cas, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_memcache_object_set arginfo_memcache_object_add
+#define arginfo_memcache_object_replace arginfo_memcache_object_add
+#define arginfo_memcache_object_set arginfo_memcache_object_add
+#define arginfo_memcache_object_cas arginfo_memcache_object_add
+#define arginfo_memcache_object_append arginfo_memcache_object_add
+#define arginfo_memcache_object_prepend arginfo_memcache_object_add
+
+#ifdef IS_MIXED
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_object_get, 0, 1, IS_MIXED, 0)
+#else
+ZEND_BEGIN_ARG_INFO_EX(arginfo_memcache_object_get, 0, 0, 1)
+#endif
+ ZEND_ARG_TYPE_MASK(0, key, MAY_BE_STRING|MAY_BE_ARRAY, 0)
+#ifdef IS_MIXED
+ ZEND_ARG_TYPE_INFO(1, flags, IS_MIXED, 0)
+ ZEND_ARG_TYPE_INFO(1, cas, IS_MIXED, 0)
+#else
+ ZEND_ARG_INFO(1, flags)
+ ZEND_ARG_INFO(1, cas)
+#endif
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_memcache_object_delete, 0, 1, MAY_BE_BOOL|MAY_BE_ARRAY)
+ ZEND_ARG_TYPE_MASK(0, key, MAY_BE_STRING|MAY_BE_ARRAY, 0)
+ ZEND_ARG_TYPE_INFO(0, exptime, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_memcache_object_getstats, 0, 0, MAY_BE_BOOL|MAY_BE_ARRAY)
+ ZEND_ARG_TYPE_INFO(0, type, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO(0, slabid, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, limit, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_memcache_object_getextendedstats arginfo_memcache_object_getstats
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_object_setcompressthreshold, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_TYPE_INFO(0, threshold, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, min_savings, IS_DOUBLE, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_memcache_object_increment, 0, 1, MAY_BE_BOOL|MAY_BE_ARRAY|MAY_BE_LONG)
+ ZEND_ARG_TYPE_MASK(0, key, MAY_BE_STRING|MAY_BE_ARRAY, 0)
+ ZEND_ARG_TYPE_INFO(0, value, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, defval, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, exptime, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_memcache_object_decrement arginfo_memcache_object_increment
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_object_close, 0, 0, _IS_BOOL, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_object_flush, 0, 0, _IS_BOOL, 0)
+ ZEND_ARG_TYPE_INFO(0, delay, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memcache_object_setSaslAuthData, 0, 2, _IS_BOOL, 0)
+ ZEND_ARG_TYPE_INFO(0, username, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO(0, password, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
static zend_function_entry php_memcache_pool_class_functions[] = {
- PHP_NAMED_FE(connect, zif_memcache_pool_connect, NULL)
- PHP_NAMED_FE(addserver, zif_memcache_pool_addserver, NULL)
- PHP_FALIAS(setserverparams, memcache_set_server_params, NULL)
- PHP_FALIAS(setfailurecallback, memcache_set_failure_callback, NULL)
- PHP_FALIAS(getserverstatus, memcache_get_server_status, NULL)
- PHP_NAMED_FE(findserver, zif_memcache_pool_findserver, NULL)
- PHP_FALIAS(getversion, memcache_get_version, NULL)
- PHP_FALIAS(add, memcache_add, NULL)
- PHP_FALIAS(set, memcache_set, NULL)
- PHP_FALIAS(replace, memcache_replace, NULL)
- PHP_FALIAS(cas, memcache_cas, NULL)
- PHP_FALIAS(append, memcache_append, NULL)
- PHP_FALIAS(prepend, memcache_prepend, NULL)
+ PHP_NAMED_FE(connect, zif_memcache_pool_connect, arginfo_memcache_pool_object_connect)
+ PHP_NAMED_FE(addserver, zif_memcache_pool_addserver, arginfo_memcache_pool_object_addserver)
+ PHP_FALIAS(setserverparams, memcache_set_server_params, arginfo_memcache_object_setserverparams)
+ PHP_FALIAS(setfailurecallback, memcache_set_failure_callback, arginfo_memcache_object_setfailurecallback)
+ PHP_FALIAS(getserverstatus, memcache_get_server_status, arginfo_memcache_object_getserverstatus)
+ PHP_NAMED_FE(findserver, zif_memcache_pool_findserver, arginfo_memcache_object_findserver)
+ PHP_FALIAS(getversion, memcache_get_version, arginfo_memcache_object_getversion)
+ PHP_FALIAS(add, memcache_add, arginfo_memcache_object_add)
+ PHP_FALIAS(set, memcache_set, arginfo_memcache_object_set)
+ PHP_FALIAS(replace, memcache_replace, arginfo_memcache_object_replace)
+ PHP_FALIAS(cas, memcache_cas, arginfo_memcache_object_cas)
+ PHP_FALIAS(append, memcache_append, arginfo_memcache_object_append)
+ PHP_FALIAS(prepend, memcache_prepend, arginfo_memcache_object_prepend)
PHP_FALIAS(get, memcache_get, arginfo_memcache_object_get)
- PHP_FALIAS(delete, memcache_delete, NULL)
- PHP_FALIAS(getstats, memcache_get_stats, NULL)
- PHP_FALIAS(getextendedstats, memcache_get_extended_stats, NULL)
- PHP_FALIAS(setcompressthreshold, memcache_set_compress_threshold, NULL)
- PHP_FALIAS(increment, memcache_increment, NULL)
- PHP_FALIAS(decrement, memcache_decrement, NULL)
- PHP_FALIAS(close, memcache_close, NULL)
- PHP_FALIAS(flush, memcache_flush, NULL)
- PHP_FALIAS(setSaslAuthData, memcache_set_sasl_auth_data, NULL)
-
- {NULL, NULL, NULL}
+ PHP_FALIAS(delete, memcache_delete, arginfo_memcache_object_delete)
+ PHP_FALIAS(getstats, memcache_get_stats, arginfo_memcache_object_getstats)
+ PHP_FALIAS(getextendedstats, memcache_get_extended_stats, arginfo_memcache_object_getextendedstats)
+ PHP_FALIAS(setcompressthreshold, memcache_set_compress_threshold, arginfo_memcache_object_setcompressthreshold)
+ PHP_FALIAS(increment, memcache_increment, arginfo_memcache_object_increment)
+ PHP_FALIAS(decrement, memcache_decrement, arginfo_memcache_object_decrement)
+ PHP_FALIAS(close, memcache_close, arginfo_memcache_object_close)
+ PHP_FALIAS(flush, memcache_flush, arginfo_memcache_object_flush)
+ PHP_FALIAS(setSaslAuthData, memcache_set_sasl_auth_data, arginfo_memcache_object_setSaslAuthData)
+ ZEND_FE_END
};
static zend_function_entry php_memcache_class_functions[] = {
- PHP_FALIAS(connect, memcache_connect, NULL)
- PHP_FALIAS(pconnect, memcache_pconnect, NULL)
- PHP_FALIAS(addserver, memcache_add_server, NULL)
- {NULL, NULL, NULL}
+ PHP_ME_MAPPING(connect, memcache_connect, arginfo_memcache_object_connect, ZEND_ACC_PUBLIC)
+ PHP_ME_MAPPING(pconnect, memcache_pconnect, arginfo_memcache_object_pconnect, ZEND_ACC_PUBLIC)
+ PHP_ME_MAPPING(addserver, memcache_add_server, arginfo_memcache_object_addserver, ZEND_ACC_PUBLIC)
+ ZEND_FE_END
};
/* }}} */
@@ -269,7 +530,7 @@
if (new_value) {
for (i=0 ; i<ZSTR_LEN(new_value) ; i++) {
if (ZSTR_VAL(new_value)[i]=='.') {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "memcache.session_prefix_static_key cannot have dot inside (.)");
+ php_error_docref(NULL, E_WARNING, "memcache.session_prefix_static_key cannot have dot inside (.)");
return FAILURE;
}
}
@@ -292,14 +553,14 @@
STD_PHP_INI_ENTRY("memcache.session_redundancy", "2", PHP_INI_ALL, OnUpdateRedundancy, session_redundancy, zend_memcache_globals, memcache_globals)
STD_PHP_INI_ENTRY("memcache.compress_threshold", "20000", PHP_INI_ALL, OnUpdateCompressThreshold, compress_threshold, zend_memcache_globals, memcache_globals)
STD_PHP_INI_ENTRY("memcache.lock_timeout", "15", PHP_INI_ALL, OnUpdateLockTimeout, lock_timeout, zend_memcache_globals, memcache_globals)
- STD_PHP_INI_ENTRY("memcache.session_prefix_host_key", "0", PHP_INI_ALL, OnUpdateBool, session_prefix_host_key, zend_memcache_globals, memcache_globals)
- STD_PHP_INI_ENTRY("memcache.session_prefix_host_key_remove_www", "1", PHP_INI_ALL, OnUpdateBool, session_prefix_host_key_remove_www, zend_memcache_globals, memcache_globals)
- STD_PHP_INI_ENTRY("memcache.session_prefix_host_key_remove_subdomain", "0", PHP_INI_ALL, OnUpdateBool, session_prefix_host_key_remove_subdomain, zend_memcache_globals, memcache_globals)
+ STD_PHP_INI_BOOLEAN("memcache.session_prefix_host_key", "0", PHP_INI_ALL, OnUpdateBool, session_prefix_host_key, zend_memcache_globals, memcache_globals)
+ STD_PHP_INI_BOOLEAN("memcache.session_prefix_host_key_remove_www", "1", PHP_INI_ALL, OnUpdateBool, session_prefix_host_key_remove_www, zend_memcache_globals, memcache_globals)
+ STD_PHP_INI_BOOLEAN("memcache.session_prefix_host_key_remove_subdomain", "0", PHP_INI_ALL, OnUpdateBool, session_prefix_host_key_remove_subdomain, zend_memcache_globals, memcache_globals)
STD_PHP_INI_ENTRY("memcache.session_prefix_static_key", NULL, PHP_INI_ALL, OnUpdatePrefixStaticKey, session_prefix_static_key, zend_memcache_globals, memcache_globals)
STD_PHP_INI_ENTRY("memcache.session_save_path", NULL, PHP_INI_ALL, OnUpdateString, session_save_path, zend_memcache_globals, memcache_globals)
- STD_PHP_INI_ENTRY("memcache.prefix_host_key", "0", PHP_INI_ALL, OnUpdateBool, prefix_host_key, zend_memcache_globals, memcache_globals)
- STD_PHP_INI_ENTRY("memcache.prefix_host_key_remove_www", "1", PHP_INI_ALL, OnUpdateBool, prefix_host_key_remove_www, zend_memcache_globals, memcache_globals)
- STD_PHP_INI_ENTRY("memcache.prefix_host_key_remove_subdomain", "0", PHP_INI_ALL, OnUpdateBool, prefix_host_key_remove_subdomain, zend_memcache_globals, memcache_globals)
+ STD_PHP_INI_BOOLEAN("memcache.prefix_host_key", "0", PHP_INI_ALL, OnUpdateBool, prefix_host_key, zend_memcache_globals, memcache_globals)
+ STD_PHP_INI_BOOLEAN("memcache.prefix_host_key_remove_www", "1", PHP_INI_ALL, OnUpdateBool, prefix_host_key_remove_www, zend_memcache_globals, memcache_globals)
+ STD_PHP_INI_BOOLEAN("memcache.prefix_host_key_remove_subdomain", "0", PHP_INI_ALL, OnUpdateBool, prefix_host_key_remove_subdomain, zend_memcache_globals, memcache_globals)
STD_PHP_INI_ENTRY("memcache.prefix_static_key", NULL, PHP_INI_ALL, OnUpdatePrefixStaticKey, prefix_static_key, zend_memcache_globals, memcache_globals)
PHP_INI_END()
/* }}} */
@@ -458,7 +719,7 @@
*/
PHP_RINIT_FUNCTION(memcache)
{
- MEMCACHE_G(session_key_prefix) = get_session_key_prefix(TSRMLS_C);
+ MEMCACHE_G(session_key_prefix) = get_session_key_prefix();
return SUCCESS;
}
@@ -867,6 +1128,10 @@
/* execute all requests */
mmc_pool_run(pool);
+
+ if (Z_TYPE_P(return_value) == IS_NULL) {
+ RETURN_FALSE;
+ }
}
/* }}} */
@@ -878,7 +1143,7 @@
memcpy((char *)persistent_id, key, key_len+1);
if (zend_register_persistent_resource ( (char*) persistent_id, key_len, mmc, le_memcache_server) == NULL) ;
- then not forget to pefree, check refcounts in _mmc_server_free / _mmc_server_list_dtor , etc.
+ then not forget to pefree, check refcounts in _mmc_server_free / _mmc_server_list_dtor , etc.
otherwise we will leak mem with persistent connections /run into other trouble with later versions
*/
mmc_t *mmc_find_persistent(const char *host, int host_len, unsigned short port, unsigned short udp_port, double timeout, int retry_interval) /* {{{ */
@@ -1018,8 +1283,13 @@
if (pool->protocol == &mmc_binary_protocol) {
zval rv1, rv2;
+#if PHP_VERSION_ID >= 80000
+ zval *username = zend_read_property(memcache_ce, Z_OBJ_P(mmc_object), "username", strlen("username"), 1, &rv1);
+ zval *password = zend_read_property(memcache_ce, Z_OBJ_P(mmc_object), "password", strlen("password"), 1, &rv2);
+#else
zval *username = zend_read_property(memcache_ce, mmc_object, "username", strlen("username"), 1, &rv1);
zval *password = zend_read_property(memcache_ce, mmc_object, "password", strlen("password"), 1, &rv2);
+#endif
if (Z_TYPE_P(username) == IS_STRING && Z_TYPE_P(password) == IS_STRING) {
if (Z_STRLEN_P(username) > 1 && Z_STRLEN_P(password) > 1) {
mmc_request_t *request;
@@ -1058,7 +1328,7 @@
/* initialize pool and object if need be */
if (!mmc_object) {
zend_resource *list_res;
- mmc_pool_t *pool = mmc_pool_new();
+ pool = mmc_pool_new();
pool->failure_callback = (mmc_failure_callback) &php_mmc_failure_callback;
list_res = zend_register_resource(pool, le_memcache_pool);
mmc_object = return_value;
@@ -1241,7 +1511,7 @@
}
ZVAL_LONG(errnum, mmc->errnum);
- call_user_function_ex(EG(function_table), NULL, callback, &retval, 5, params, 0, NULL);
+ call_user_function(EG(function_table), NULL, callback, &retval, 5, params);
zval_ptr_dtor(host);
zval_ptr_dtor(tcp_port); zval_ptr_dtor(udp_port);
@@ -1252,7 +1522,7 @@
}
}
else {
- php_mmc_set_failure_callback(pool, (zval *)param, NULL);
+ php_mmc_set_failure_callback(pool, param, NULL);
php_error_docref(NULL, E_WARNING, "Invalid failure callback");
}
}
@@ -1692,6 +1962,10 @@
}
}
}
+
+ if (Z_TYPE_P(return_value) == IS_NULL) {
+ RETURN_FALSE;
+ }
}
/* }}} */
@@ -1754,6 +2028,9 @@
if (Z_TYPE_P(result[0]) != IS_ARRAY) {
array_init(result[0]);
}
+
+ ZEND_ASSERT(key_len > 0);
+
add_assoc_zval_ex(result[0], (char *)key, key_len, value);
/* add flags to result */
@@ -1881,19 +2158,23 @@
if (mmc_prepare_key(keys, request->key, &(request->key_len)) != MMC_OK) {
mmc_pool_release(pool, request);
php_error_docref(NULL, E_WARNING, "Invalid key");
- return;
+ RETURN_FALSE;
}
pool->protocol->get(request, cas != NULL ? MMC_OP_GETS : MMC_OP_GET, keys, request->key, request->key_len);
/* schedule request */
if (mmc_pool_schedule_key(pool, request->key, request->key_len, request, 1) != MMC_OK) {
- return;
+ RETURN_FALSE;
}
}
/* execute all requests */
mmc_pool_run(pool);
+
+ if (Z_TYPE_P(return_value) == IS_NULL) {
+ RETURN_FALSE;
+ }
}
/* }}} */
@@ -2000,6 +2281,10 @@
/* execute all requests */
mmc_pool_run(pool);
+
+ if (Z_TYPE_P(return_value) == IS_NULL) {
+ RETURN_FALSE;
+ }
}
/* }}} */
@@ -2057,6 +2342,10 @@
/* execute all requests */
mmc_pool_run(pool);
+
+ if (Z_TYPE_P(return_value) == IS_NULL) {
+ RETURN_FALSE;
+ }
}
/* }}} */
@@ -2241,8 +2530,13 @@
if (user_length < 1 || password_length < 1) {
RETURN_FALSE;
}
+#if PHP_VERSION_ID >= 80000
+ zend_update_property_stringl(memcache_pool_ce, Z_OBJ_P(mmc_object), "username", strlen("username"), user, user_length);
+ zend_update_property_stringl(memcache_pool_ce, Z_OBJ_P(mmc_object), "password", strlen("password"), password, password_length);
+#else
zend_update_property_stringl(memcache_pool_ce, mmc_object, "username", strlen("username"), user, user_length);
zend_update_property_stringl(memcache_pool_ce, mmc_object, "password", strlen("password"), password, password_length);
+#endif
RETURN_TRUE;
}
/* }}} */
@@ -2252,6 +2546,8 @@
PHP_FUNCTION(memcache_debug)
{
php_error_docref(NULL, E_WARNING, "memcache_debug() is deprecated, please use a debugger (like Eclipse + CDT)");
+
+ RETVAL_BOOL(PHP_DEBUG);
}
/* }}} */
--- php7/memcache_ascii_protocol.c.orig 2020-09-25 03:29:24.000000000 +0800
+++ php7/memcache_ascii_protocol.c 2020-10-16 15:52:01.000000000 +0800
@@ -56,11 +56,16 @@
}
/* }}} */
-static int mmc_request_check_response(const char *line, int line_len) /*
+static int mmc_request_check_response(char *line, int line_len) /*
checks for response status and error codes {{{ */
{
int response;
+ // remove newline and thus prevent passing it to userland
+ if (line_len >= 2 && line[line_len - 2] == '\r' && line[line_len - 1] == '\n') {
+ line[line_len - 2] = '\0';
+ }
+
if (mmc_str_left(line, "OK", line_len, sizeof("OK")-1) ||
mmc_str_left(line, "STORED", line_len, sizeof("STORED")-1) ||
mmc_str_left(line, "DELETED", line_len, sizeof("DELETED")-1))
@@ -129,7 +134,7 @@
return request->response_handler(mmc, request, response, line, line_len - (sizeof("\r\n")-1), request->response_handler_param);
}
- if (sscanf(line, "%lu", &lval) < 1) {
+ if (sscanf(line, "%ld", &lval) < 1) {
return mmc_server_failure(mmc, request->io, "Malformed VALUE header", 0);
}
--- php7/memcache_binary_protocol.c.orig 2020-09-25 03:29:24.000000000 +0800
+++ php7/memcache_binary_protocol.c 2020-10-16 15:52:01.000000000 +0800
@@ -61,6 +61,12 @@
# define htonll mmc_htonll
#endif
+#ifdef __GNUC__
+# define MMC_ATTR_PACKED __attribute__((packed))
+#else
+# define MMC_ATTR_PACKED
+#endif /* UD_ATTR_PACKED */
+
#define MMC_REQUEST_MAGIC 0x80
#define MMC_RESPONSE_MAGIC 0x81
@@ -79,6 +85,15 @@
#define MMC_BIN_OP_APPEND 0x0e
#define MMC_BIN_OP_PREPEND 0x0f
+#define MMC_BINARY_STATUS_OK 0x00
+#define MMC_BINARY_STATUS_KEY_NOT_FOUND 0x01
+#define MMC_BINARY_STATUS_KEY_EXISTS 0x02
+#define MMC_BINARY_STATUS_VALUE_TOO_LARGE 0x03
+#define MMC_BINARY_STATUS_INVALID_ARGS 0x04
+#define MMC_BINARY_STATUS_ITEM_NOT_STORED 0x05
+#define MMC_BINARY_STATUS_INCR_DECR_ERROR 0x06 /* Incr/Decr on non-numeric value */
+#define MMC_BINARY_STATUS_UNKNOWN_COMMAND 0x81
+#define MMC_BINARY_STATUS_OUT_OF_MEMORY 0x82
#define MMC_OP_SASL_LIST 0x20
#define MMC_OP_SASL_AUTH 0x21
@@ -90,7 +105,7 @@
mmc_queue_t keys; /* mmc_queue_t<zval *>, reqid -> key mappings */
struct {
uint8_t opcode;
- uint8_t error; /* error received in current request */
+ uint16_t error; /* error received in current request */
uint32_t reqid; /* current reqid being processed */
} command;
struct { /* stores value info while the body is being read */
@@ -107,64 +122,63 @@
uint8_t extras_len;
uint8_t datatype;
uint16_t _reserved;
- uint32_t length; /* trailing body length (not including this header) */
+ uint32_t length; /* trailing body total_body_length (not including this header) */
uint32_t reqid; /* opaque request id */
uint64_t cas;
-} mmc_request_header_t;
+} MMC_ATTR_PACKED mmc_request_header_t;
typedef struct mmc_get_request_header {
mmc_request_header_t base;
-} mmc_get_request_header_t;
+} MMC_ATTR_PACKED mmc_get_request_header_t;
typedef struct mmc_version_request_header {
mmc_request_header_t base;
-} mmc_version_request_header_t;
+} MMC_ATTR_PACKED mmc_version_request_header_t;
typedef struct mmc_store_request_header {
mmc_request_header_t base;
uint32_t flags;
uint32_t exptime;
-} mmc_store_request_header_t;
+} MMC_ATTR_PACKED mmc_store_request_header_t;
typedef struct mmc_store_append_header {
mmc_request_header_t base;
-} mmc_store_append_header_t;
+} MMC_ATTR_PACKED mmc_store_append_header_t;
typedef struct mmc_delete_request_header {
mmc_request_header_t base;
- uint32_t exptime;
-} mmc_delete_request_header_t;
+} MMC_ATTR_PACKED mmc_delete_request_header_t;
typedef struct mmc_mutate_request_header {
mmc_request_header_t base;
uint64_t delta;
uint64_t initial;
uint32_t expiration;
-} mmc_mutate_request_header_t;
+} MMC_ATTR_PACKED mmc_mutate_request_header_t;
typedef struct mmc_sasl_request_header {
mmc_request_header_t base;
-} mmc_sasl_request_header;
+} MMC_ATTR_PACKED mmc_sasl_request_header;
typedef struct mmc_response_header {
uint8_t magic;
uint8_t opcode;
- uint16_t error;
+ uint16_t key_len;
uint8_t extras_len;
uint8_t datatype;
uint16_t status;
- uint32_t length; /* trailing body length (not including this header) */
+ uint32_t total_body_length; /* trailing body total_body_length (not including this header) */
uint32_t reqid; /* echo'ed from request */
uint64_t cas;
-} mmc_response_header_t;
+} MMC_ATTR_PACKED mmc_response_header_t;
typedef struct mmc_get_response_header {
uint32_t flags;
-} mmc_get_response_header_t;
+} MMC_ATTR_PACKED mmc_get_response_header_t;
typedef struct mmc_mutate_response_header {
uint64_t value;
-} mmc_mutate_response_header_t;
+} MMC_ATTR_PACKED mmc_mutate_response_header_t;
static int mmc_request_read_response(mmc_t *, mmc_request_t *);
static int mmc_request_parse_value(mmc_t *, mmc_request_t *);
@@ -252,9 +266,40 @@
}
req->command.opcode = header->opcode;
- req->command.error = ntohs(header->error);
+
+ switch (ntohs(header->status)) {
+ case MMC_BINARY_STATUS_OK:
+ req->command.error = MMC_OK;
+ break;
+ case MMC_BINARY_STATUS_KEY_NOT_FOUND:
+ req->command.error = MMC_RESPONSE_NOT_FOUND;
+ break;
+ case MMC_BINARY_STATUS_KEY_EXISTS:
+ req->command.error = MMC_RESPONSE_EXISTS;
+ break;
+ case MMC_BINARY_STATUS_VALUE_TOO_LARGE:
+ req->command.error = MMC_RESPONSE_TOO_LARGE;
+ break;
+ case MMC_BINARY_STATUS_INVALID_ARGS:
+ case MMC_BINARY_STATUS_INCR_DECR_ERROR:
+ req->command.error = MMC_RESPONSE_CLIENT_ERROR;
+ break;
+ case MMC_BINARY_STATUS_ITEM_NOT_STORED:
+ req->command.error = MMC_RESPONSE_NOT_STORED;
+ break;
+ case MMC_BINARY_STATUS_UNKNOWN_COMMAND:
+ req->command.error = MMC_RESPONSE_UNKNOWN_CMD;
+ break;
+ case MMC_BINARY_STATUS_OUT_OF_MEMORY:
+ req->command.error = MMC_RESPONSE_OUT_OF_MEMORY;
+ break;
+ default:
+ req->command.error = MMC_RESPONSE_UNKNOWN;
+ break;
+ }
+
req->command.reqid = ntohl(header->reqid);
- req->value.length = ntohl(header->length);
+ req->value.length = ntohl(header->total_body_length);
req->value.cas = ntohll(header->cas);
if (req->value.length == 0) {
@@ -434,6 +479,7 @@
header->_reserved = 0;
header->length = htonl(key_len + extras_len + length);
header->reqid = htonl(reqid);
+ header->cas = 0;
}
/* }}} */
@@ -618,8 +664,7 @@
request->parse = mmc_request_parse_response;
req->next_parse_handler = mmc_request_read_response;
- mmc_pack_header(&(header.base), MMC_OP_DELETE, 0, key_len, sizeof(header) - sizeof(header.base), 0);
- header.exptime = htonl(exptime);
+ mmc_pack_header(&(header.base), MMC_OP_DELETE, 0, key_len, 0, 0);
smart_string_appendl(&(request->sendbuf.value), (const char *)&header, sizeof(header));
smart_string_appendl(&(request->sendbuf.value), key, key_len);
@@ -659,7 +704,6 @@
else {
/* server replies with NOT_FOUND if exptime ~0 and key doesn't exist */
header.expiration = ~(uint32_t)0;
- header.expiration = htonl(0x00000e10);
}
/* mutate request is 43 bytes */
--- php7/memcache_pool.c.orig 2020-09-25 03:29:24.000000000 +0800
+++ php7/memcache_pool.c 2020-10-16 15:52:01.000000000 +0800
@@ -41,6 +41,24 @@
ZEND_DECLARE_MODULE_GLOBALS(memcache)
+#if PHP_VERSION_ID >= 80000
+#define mmc_string_concat2 zend_string_concat2
+#else
+static zend_string* mmc_string_concat2(
+ const char *str1, size_t str1_len,
+ const char *str2, size_t str2_len)
+{
+ size_t len = str1_len + str2_len;
+ zend_string *res = zend_string_alloc(len, 0);
+
+ memcpy(ZSTR_VAL(res), str1, str1_len);
+ memcpy(ZSTR_VAL(res) + str1_len, str2, str2_len);
+ ZSTR_VAL(res)[len] = '\0';
+
+ return res;
+}
+#endif
+
MMC_POOL_INLINE void mmc_buffer_alloc(mmc_buffer_t *buffer, unsigned int size) /*
ensures space for an additional size bytes {{{ */
{
@@ -407,6 +425,7 @@
PHP_VAR_SERIALIZE_DESTROY(value_hash);
if (!buf.s) {
+ zval_dtor(&value_copy);
php_error_docref(NULL, E_WARNING, "Failed to serialize value");
return MMC_REQUEST_FAILURE;
}
@@ -733,7 +752,16 @@
/* check connection and extract socket for select() purposes */
if (!io->stream || php_stream_cast(io->stream, PHP_STREAM_AS_FD_FOR_SELECT, (void **)&fd, 1) != SUCCESS) {
- mmc_server_seterror(mmc, errstr != NULL ? ZSTR_VAL(errstr) : "Connection failed", errnum);
+ if (errstr != NULL) {
+ zend_string* error = mmc_string_concat2(
+ "Connection failed: ", sizeof("Connection failed: ") - 1,
+ ZSTR_VAL(errstr), ZSTR_LEN(errstr));
+
+ mmc_server_seterror(mmc, ZSTR_VAL(error), errnum);
+ zend_string_release(error);
+ } else {
+ mmc_server_seterror(mmc, "Connection failed", errnum);
+ }
mmc_server_deactivate(pool, mmc);
if (errstr != NULL) {
@@ -821,6 +849,8 @@
void mmc_server_free(mmc_t *mmc) /* {{{ */
{
+ mmc_server_sleep(mmc);
+
pefree(mmc->host, mmc->persistent);
pefree(mmc, mmc->persistent);
}
--- php7/memcache_session.c.orig 2020-09-25 03:29:24.000000000 +0800
+++ php7/memcache_session.c 2020-10-16 15:52:01.000000000 +0800
@@ -64,12 +64,13 @@
}
if (!path) {
PS_SET_MOD_DATA(NULL);
+ ZEND_ASSERT(0 && "open");
return FAILURE;
}
pool = mmc_pool_new();
- for (i=0,j=0,path_len=strlen(path); i<path_len; i=j+1) {
+ for (i=0,path_len=strlen(path); i<path_len; i=j+1) {
/* find beginning of url */
while (i<path_len && (isspace(path[i]) || path[i] == ',')) {
i++;
@@ -205,6 +206,7 @@
mmc_pool_free(pool);
PS_SET_MOD_DATA(NULL);
+ ZEND_ASSERT(0 &&"open");
return FAILURE;
}
/* }}} */
@@ -360,12 +362,12 @@
if (skip_servers.len == pool->num_servers && skip_servers.len < MEMCACHE_G(session_redundancy)) {
*val = ZSTR_EMPTY_ALLOC();
mmc_queue_free(&skip_servers);
- zval_ptr_dtor(&dataresult);
return SUCCESS;
-
}
}
else {
+ zval_dtor(&dataresult);
+
/* if missing lock, back off and retry same server */
last_index = prev_index;
usleep(timeout);
@@ -417,6 +419,9 @@
if (mmc_prepare_key_ex(ZSTR_VAL(key), ZSTR_LEN(key), datarequest->key, &(datarequest->key_len), MEMCACHE_G(session_key_prefix)) != MMC_OK) {
mmc_pool_release(pool, datarequest);
+ if (lockrequest != NULL) {
+ mmc_pool_release(pool, lockrequest);
+ }
break;
}
@@ -450,6 +455,7 @@
mmc_pool_schedule(pool, mmc, lockrequest) != MMC_OK) {
mmc_pool_release(pool, datarequest);
mmc_pool_release(pool, lockrequest);
+ lockrequest = NULL;
continue;
}
} while (skip_servers.len < MEMCACHE_G(session_redundancy) && skip_servers.len < pool->num_servers);