Skip to content

Commit 14fa973

Browse files
committed
Do not use zend_fcall_info_argp() for ticks and shutdown functions
Using zend_fcall_info_argp() reallocates the ZVALs on the heap and they need to be freed afterwards. TODO Error with tick functions
1 parent 445a87e commit 14fa973

File tree

1 file changed

+9
-10
lines changed

1 file changed

+9
-10
lines changed

ext/standard/basic_functions.c

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,6 +1598,9 @@ PHP_FUNCTION(forward_static_call_array)
15981598
static void fci_addref(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache)
15991599
{
16001600
Z_TRY_ADDREF(fci->function_name);
1601+
for (uint32_t i = 0; i < fci->param_count; ++i) {
1602+
Z_TRY_ADDREF(fci->params[i]);
1603+
}
16011604
if (fci_cache->object) {
16021605
GC_ADDREF(fci_cache->object);
16031606
}
@@ -1606,24 +1609,26 @@ static void fci_addref(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache)
16061609
static void fci_release(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache)
16071610
{
16081611
zval_ptr_dtor(&fci->function_name);
1612+
for (uint32_t i = 0; i < fci->param_count; ++i) {
1613+
zval_ptr_dtor(&fci->params[i]);
1614+
}
16091615
if (fci_cache->object) {
16101616
zend_object_release(fci_cache->object);
16111617
}
1618+
zend_release_fcall_info_cache(fci_cache);
16121619
}
16131620

16141621
void user_shutdown_function_dtor(zval *zv) /* {{{ */
16151622
{
16161623
php_shutdown_function_entry *shutdown_function_entry = Z_PTR_P(zv);
16171624

1618-
zend_fcall_info_args_clear(&shutdown_function_entry->fci, true);
16191625
fci_release(&shutdown_function_entry->fci, &shutdown_function_entry->fci_cache);
16201626
efree(shutdown_function_entry);
16211627
}
16221628
/* }}} */
16231629

16241630
void user_tick_function_dtor(user_tick_function_entry *tick_function_entry) /* {{{ */
16251631
{
1626-
zend_fcall_info_args_clear(&tick_function_entry->fci, true);
16271632
fci_release(&tick_function_entry->fci, &tick_function_entry->fci_cache);
16281633
}
16291634
/* }}} */
@@ -1722,16 +1727,13 @@ PHPAPI void php_free_shutdown_functions(void) /* {{{ */
17221727
PHP_FUNCTION(register_shutdown_function)
17231728
{
17241729
php_shutdown_function_entry entry;
1725-
zval *params = NULL;
1726-
uint32_t param_count = 0;
17271730
bool status;
17281731

1729-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "f*", &entry.fci, &entry.fci_cache, &params, &param_count) == FAILURE) {
1732+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "f*", &entry.fci, &entry.fci_cache, &entry.fci.params, &entry.fci.param_count) == FAILURE) {
17301733
RETURN_THROWS();
17311734
}
17321735

17331736
fci_addref(&entry.fci, &entry.fci_cache);
1734-
zend_fcall_info_argp(&entry.fci, param_count, params);
17351737

17361738
status = append_user_shutdown_function(&entry);
17371739
ZEND_ASSERT(status);
@@ -2310,16 +2312,13 @@ PHP_FUNCTION(getprotobynumber)
23102312
PHP_FUNCTION(register_tick_function)
23112313
{
23122314
user_tick_function_entry tick_fe;
2313-
zval *params = NULL;
2314-
uint32_t param_count = 0;
23152315

2316-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "f*", &tick_fe.fci, &tick_fe.fci_cache, &params, &param_count) == FAILURE) {
2316+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "f*", &tick_fe.fci, &tick_fe.fci_cache, &tick_fe.fci.params, &tick_fe.fci.param_count) == FAILURE) {
23172317
RETURN_THROWS();
23182318
}
23192319

23202320
tick_fe.calling = false;
23212321
fci_addref(&tick_fe.fci, &tick_fe.fci_cache);
2322-
zend_fcall_info_argp(&tick_fe.fci, param_count, params);
23232322

23242323
if (!BG(user_tick_functions)) {
23252324
BG(user_tick_functions) = (zend_llist *) emalloc(sizeof(zend_llist));

0 commit comments

Comments
 (0)