diff options
Diffstat (limited to 'apcu-upstream.patch')
-rw-r--r-- | apcu-upstream.patch | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/apcu-upstream.patch b/apcu-upstream.patch new file mode 100644 index 0000000..9170b6a --- /dev/null +++ b/apcu-upstream.patch @@ -0,0 +1,253 @@ +diff --git a/apc_arginfo.h b/apc_arginfo.h +index 0bd61c9..8ba2686 100644 +--- a/apc_arginfo.h ++++ b/apc_arginfo.h +@@ -76,6 +76,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_apcu_entry, 0, 0, 2) + ZEND_ARG_TYPE_INFO(0, generator, IS_CALLABLE, 0) + ZEND_ARG_TYPE_INFO(0, ttl, IS_LONG, 0) + ZEND_END_ARG_INFO() ++ ++ZEND_BEGIN_ARG_INFO_EX(arginfo_apcu_inc_request_time, 0, 0, 0) ++ ZEND_ARG_INFO(0, by) ++ZEND_END_ARG_INFO() + /* }}} */ + + #endif +diff --git a/apc_globals.h b/apc_globals.h +index 74c8f27..87625c9 100644 +--- a/apc_globals.h ++++ b/apc_globals.h +@@ -62,7 +62,7 @@ ZEND_BEGIN_MODULE_GLOBALS(apcu) + + char *serializer_name; /* the serializer config option */ + +- volatile zend_bool recursion; ++ volatile unsigned recursion; + ZEND_END_MODULE_GLOBALS(apcu) + + /* (the following is defined in php_apc.c) */ +diff --git a/apc_iterator.c b/apc_iterator.c +index 302b086..f601a27 100644 +--- a/apc_iterator.c ++++ b/apc_iterator.c +@@ -297,7 +297,8 @@ static void apc_iterator_totals(apc_iterator_t *iterator) { + void apc_iterator_obj_init(apc_iterator_t *iterator, zval *search, zend_long format, zend_long chunk_size, zend_long list) + { + if (!APCG(enabled)) { +- apc_error("APC must be enabled to use " APC_ITERATOR_NAME); ++ zend_throw_error(NULL, "APC must be enabled to use " APC_ITERATOR_NAME); ++ return; + } + + if (chunk_size < 0) { +diff --git a/apc_signal.c b/apc_signal.c +index aff13c8..22504e5 100644 +--- a/apc_signal.c ++++ b/apc_signal.c +@@ -113,7 +113,7 @@ static void apc_rehandle_signal(int signo, siginfo_t *siginfo, void *context) + */ + static int apc_register_signal(int signo, void (*handler)(int, siginfo_t*, void*)) + { +- struct sigaction sa = {{0}}; ++ struct sigaction sa; + apc_signal_entry_t p_sig = {0}; + + if (sigaction(signo, NULL, &sa) == 0) { +diff --git a/apc_sma.c b/apc_sma.c +index da457d3..3150d92 100644 +--- a/apc_sma.c ++++ b/apc_sma.c +@@ -234,8 +234,8 @@ static APC_HOTSPOT size_t sma_deallocate(void* shmaddr, size_t offset) + block_t* nxt; /* the block after cur */ + size_t size; /* size of deallocated block */ + ++ assert(offset >= ALIGNWORD(sizeof(struct block_t))); + offset -= ALIGNWORD(sizeof(struct block_t)); +- assert(offset >= 0); + + /* find position of new block in free list */ + cur = BLOCKAT(offset); +diff --git a/php_apc.c b/php_apc.c +index ad9351d..e08a770 100644 +--- a/php_apc.c ++++ b/php_apc.c +@@ -93,7 +93,7 @@ static void php_apc_init_globals(zend_apcu_globals* apcu_globals) + apcu_globals->smart = 0; + apcu_globals->preload_path = NULL; + apcu_globals->coredump_unmap = 0; +- apcu_globals->use_request_time = 1; ++ apcu_globals->use_request_time = 0; + apcu_globals->serializer_name = NULL; + apcu_globals->recursion = 0; + } +@@ -151,7 +151,7 @@ STD_PHP_INI_BOOLEAN("apc.enable_cli", "0", PHP_INI_SYSTEM, OnUpdateBool, + STD_PHP_INI_BOOLEAN("apc.slam_defense", "0", PHP_INI_SYSTEM, OnUpdateBool, slam_defense, zend_apcu_globals, apcu_globals) + STD_PHP_INI_ENTRY("apc.preload_path", (char*)NULL, PHP_INI_SYSTEM, OnUpdateString, preload_path, zend_apcu_globals, apcu_globals) + STD_PHP_INI_BOOLEAN("apc.coredump_unmap", "0", PHP_INI_SYSTEM, OnUpdateBool, coredump_unmap, zend_apcu_globals, apcu_globals) +-STD_PHP_INI_BOOLEAN("apc.use_request_time", "1", PHP_INI_ALL, OnUpdateBool, use_request_time, zend_apcu_globals, apcu_globals) ++STD_PHP_INI_BOOLEAN("apc.use_request_time", "0", PHP_INI_ALL, OnUpdateBool, use_request_time, zend_apcu_globals, apcu_globals) + STD_PHP_INI_ENTRY("apc.serializer", "php", PHP_INI_SYSTEM, OnUpdateStringUnempty, serializer_name, zend_apcu_globals, apcu_globals) + PHP_INI_END() + +@@ -475,12 +475,14 @@ static void apc_store_helper(INTERNAL_FUNCTION_PARAMETERS, const zend_bool exclu + ZEND_HASH_FOREACH_KEY_VAL(hash, hkey_idx, hkey, hentry) { + ZVAL_DEREF(hentry); + if (hkey) { +- if (!apc_cache_store(apc_user_cache, hkey, hentry, (uint32_t) ttl, exclusive)) { +- zend_hash_add_new(Z_ARRVAL_P(return_value), hkey, &fail_zv); +- } ++ zend_string_addref(hkey); + } else { +- zend_hash_index_add_new(Z_ARRVAL_P(return_value), hkey_idx, &fail_zv); ++ hkey = zend_long_to_str(hkey_idx); ++ } ++ if (!apc_cache_store(apc_user_cache, hkey, hentry, (uint32_t) ttl, exclusive)) { ++ zend_symtable_add_new(Z_ARRVAL_P(return_value), hkey, &fail_zv); + } ++ zend_string_release(hkey); + } ZEND_HASH_FOREACH_END(); + return; + } else if (Z_TYPE_P(key) == IS_STRING) { +@@ -500,6 +502,9 @@ static void apc_store_helper(INTERNAL_FUNCTION_PARAMETERS, const zend_bool exclu + /* {{{ proto bool apcu_enabled(void) + returns true when apcu is usable in the current environment */ + PHP_FUNCTION(apcu_enabled) { ++ if (zend_parse_parameters_none() == FAILURE) { ++ return; ++ } + RETURN_BOOL(APCG(enabled)); + } + /* }}} */ +@@ -798,7 +803,7 @@ zend_function_entry apcu_functions[] = { + PHP_FE(apcu_exists, arginfo_apcu_exists) + PHP_FE(apcu_entry, arginfo_apcu_entry) + #ifdef APC_DEBUG +- PHP_FE(apcu_inc_request_time, NULL) ++ PHP_FE(apcu_inc_request_time, arginfo_apcu_inc_request_time) + #endif + PHP_FE_END + }; +diff --git a/tests/apc_disabled.phpt b/tests/apc_disabled.phpt +index 184a759..c3f9adf 100644 +--- a/tests/apc_disabled.phpt ++++ b/tests/apc_disabled.phpt +@@ -40,6 +40,13 @@ var_dump(apcu_cas("key", 10, 20)); + echo "\nentry\n"; + var_dump(apcu_entry("key", function() { return 42; })); + ++echo "\niterator\n"; ++try { ++ new APCUIterator; ++} catch (Error $e) { ++ echo $e->getMessage(), "\n"; ++} ++ + ?> + --EXPECTF-- + enabled +@@ -91,3 +98,6 @@ bool(false) + + entry + NULL ++ ++iterator ++APC must be enabled to use APCuIterator +diff --git a/tests/apc_entry_003.phpt b/tests/apc_entry_003.phpt +index f066583..e04bf4b 100644 +--- a/tests/apc_entry_003.phpt ++++ b/tests/apc_entry_003.phpt +@@ -13,4 +13,4 @@ $value = apcu_entry("test", function($key) { + }); + ?> + --EXPECTF-- +-Fatal error: Trait 'T' not found in %s on line %d ++Fatal error: %s +diff --git a/tests/apc_store_array_int_keys.phpt b/tests/apc_store_array_int_keys.phpt +new file mode 100644 +index 0000000..654f70c +--- /dev/null ++++ b/tests/apc_store_array_int_keys.phpt +@@ -0,0 +1,26 @@ ++--TEST-- ++apcu_store() with int keys in array should convert them to string ++--SKIPIF-- ++<?php ++require_once(__DIR__ . '/skipif.inc'); ++?> ++--INI-- ++apc.enabled=1 ++apc.enable_cli=1 ++--FILE-- ++<?php ++ ++var_dump(apcu_add(["123" => "test"])); ++var_dump(apcu_store(["123" => "test"])); ++var_dump(apcu_add(["123" => "test"])); ++ ++?> ++--EXPECT-- ++array(0) { ++} ++array(0) { ++} ++array(1) { ++ [123]=> ++ int(-1) ++} +diff --git a/tests/apc_store_reference.phpt b/tests/apc_store_reference.phpt +index 2228899..d2cb991 100644 +--- a/tests/apc_store_reference.phpt ++++ b/tests/apc_store_reference.phpt +@@ -4,6 +4,8 @@ The outermost value should always be a value, not a reference + apc.enabled=1 + apc.enable_cli=1 + apc.serializer=default ++--SKIPIF-- ++<?php if (PHP_VERSION_ID >= 80000) die('skip Requires PHP < 8.0.0'); ?> + --FILE-- + <?php + +diff --git a/tests/apc_store_reference_php8.phpt b/tests/apc_store_reference_php8.phpt +new file mode 100644 +index 0000000..1eae4bb +--- /dev/null ++++ b/tests/apc_store_reference_php8.phpt +@@ -0,0 +1,26 @@ ++--TEST-- ++The outermost value should always be a value, not a reference ++--INI-- ++apc.enabled=1 ++apc.enable_cli=1 ++apc.serializer=default ++--SKIPIF-- ++<?php if (PHP_VERSION_ID < 80000) die('skip Requires PHP >= 8.0.0'); ?> ++--FILE-- ++<?php ++ ++/* The output is different for the php serializer, because it does not replicate the ++ * cycle involving the top-level value. Instead the cycle is placed one level lower. ++ * I believe this is a bug in the php serializer. */ ++ ++$value = [&$value]; ++apcu_store(["key" => &$value]); ++$result = apcu_fetch("key"); ++var_dump($result); ++ ++?> ++--EXPECT-- ++array(1) { ++ [0]=> ++ *RECURSION* ++} +diff --git a/tests/server_test.inc b/tests/server_test.inc +index 2aede0c..75035a3 100644 +--- a/tests/server_test.inc ++++ b/tests/server_test.inc +@@ -44,6 +44,7 @@ function server_start_one($host, $port, $code = 'echo "Hello world";', $php_opts + $cmd .= " {$router}"; + } + ++ $descriptorspec[2] = array('pipe', 'w'); + $handle = proc_open(addslashes($cmd), $descriptorspec, $pipes, $doc_root, NULL, array("bypass_shell" => true, "suppress_errors" => true)); + } else { + $cmd = "exec {$php_executable} -n $php_args -t {$doc_root} -S $host:$port"; |