Skip to content

Commit 1de0f54

Browse files
committed
Do not use zend_fcall_info_argp() for ticks and shutdown functions
Instead handle the copying and safe reallocation of the param zvals ourself.
1 parent c4e4d59 commit 1de0f54

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

ext/standard/basic_functions.c

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1596,9 +1596,17 @@ PHP_FUNCTION(forward_static_call_array)
15961596
}
15971597
/* }}} */
15981598

1599-
static void fci_addref(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache)
1599+
static void fci_addref(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache, const zval *params)
16001600
{
16011601
Z_TRY_ADDREF(fci->function_name);
1602+
fci->params = NULL;
1603+
if (params) {
1604+
ZEND_ASSERT(fci->param_count);
1605+
fci->params = (zval *) safe_erealloc(fci->params, sizeof(zval), fci->param_count, 0);
1606+
for (uint32_t i = 0; i < fci->param_count; ++i) {
1607+
ZVAL_COPY(&fci->params[i], &params[i]);
1608+
}
1609+
}
16021610
if (fci_cache->object) {
16031611
GC_ADDREF(fci_cache->object);
16041612
}
@@ -1607,24 +1615,29 @@ static void fci_addref(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache)
16071615
static void fci_release(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache)
16081616
{
16091617
zval_ptr_dtor(&fci->function_name);
1618+
for (uint32_t i = 0; i < fci->param_count; ++i) {
1619+
zval_ptr_dtor(&fci->params[i]);
1620+
}
1621+
if (fci->params) {
1622+
efree(fci->params);
1623+
}
16101624
if (fci_cache->object) {
16111625
zend_object_release(fci_cache->object);
16121626
}
1627+
zend_release_fcall_info_cache(fci_cache);
16131628
}
16141629

16151630
void user_shutdown_function_dtor(zval *zv) /* {{{ */
16161631
{
16171632
php_shutdown_function_entry *shutdown_function_entry = Z_PTR_P(zv);
16181633

1619-
zend_fcall_info_args_clear(&shutdown_function_entry->fci, true);
16201634
fci_release(&shutdown_function_entry->fci, &shutdown_function_entry->fci_cache);
16211635
efree(shutdown_function_entry);
16221636
}
16231637
/* }}} */
16241638

16251639
void user_tick_function_dtor(user_tick_function_entry *tick_function_entry) /* {{{ */
16261640
{
1627-
zend_fcall_info_args_clear(&tick_function_entry->fci, true);
16281641
fci_release(&tick_function_entry->fci, &tick_function_entry->fci_cache);
16291642
}
16301643
/* }}} */
@@ -1723,16 +1736,14 @@ PHPAPI void php_free_shutdown_functions(void) /* {{{ */
17231736
PHP_FUNCTION(register_shutdown_function)
17241737
{
17251738
php_shutdown_function_entry entry;
1726-
zval *params = NULL;
1727-
uint32_t param_count = 0;
17281739
bool status;
1740+
zval *params = NULL;
17291741

1730-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "f*", &entry.fci, &entry.fci_cache, &params, &param_count) == FAILURE) {
1742+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "f*", &entry.fci, &entry.fci_cache, &params, &entry.fci.param_count) == FAILURE) {
17311743
RETURN_THROWS();
17321744
}
17331745

1734-
fci_addref(&entry.fci, &entry.fci_cache);
1735-
zend_fcall_info_argp(&entry.fci, param_count, params);
1746+
fci_addref(&entry.fci, &entry.fci_cache, params);
17361747

17371748
status = append_user_shutdown_function(&entry);
17381749
ZEND_ASSERT(status);
@@ -2312,15 +2323,13 @@ PHP_FUNCTION(register_tick_function)
23122323
{
23132324
user_tick_function_entry tick_fe;
23142325
zval *params = NULL;
2315-
uint32_t param_count = 0;
23162326

2317-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "f*", &tick_fe.fci, &tick_fe.fci_cache, &params, &param_count) == FAILURE) {
2327+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "f*", &tick_fe.fci, &tick_fe.fci_cache, &params, &tick_fe.fci.param_count) == FAILURE) {
23182328
RETURN_THROWS();
23192329
}
23202330

23212331
tick_fe.calling = false;
2322-
fci_addref(&tick_fe.fci, &tick_fe.fci_cache);
2323-
zend_fcall_info_argp(&tick_fe.fci, param_count, params);
2332+
fci_addref(&tick_fe.fci, &tick_fe.fci_cache, params);
23242333

23252334
if (!BG(user_tick_functions)) {
23262335
BG(user_tick_functions) = (zend_llist *) emalloc(sizeof(zend_llist));

0 commit comments

Comments
 (0)