MAKE_STD_ZVAL(handler_name);
zend_make_callable(output_handler, handler_name TSRMLS_CC);
handler = php_output_handler_init(handler_name, chunk_size, (flags & ~0xf) | PHP_OUTPUT_HANDLER_USER);
- handler->func.user = user;
zval_ptr_dtor(&handler_name);
+
+ ZVAL_ADDREF(output_handler);
+ user->zoh = output_handler;
+ user->fci.param_count = 2;
+ user->fci.params = (zval ***) &user->fcp;
+ handler->func.user = user;
} else {
efree(user);
}
zval_ptr_dtor(&handler->name);
STR_FREE(handler->buffer.data);
if (handler->flags & PHP_OUTPUT_HANDLER_USER) {
+ zval_ptr_dtor(&handler->func.user->zoh);
efree(handler->func.user);
}
if (handler->dtor && handler->opaq) {
ZVAL_STRINGL(params[0], handler->buffer.data, handler->buffer.used, 1);
MAKE_STD_ZVAL(params[1]);
ZVAL_LONG(params[1], (long) context->op);
- handler->func.user->fci.param_count = 2;
- handler->func.user->fci.params = (zval***) safe_emalloc(handler->func.user->fci.param_count, sizeof(zval**), 0);
handler->func.user->fci.params[0] = ¶ms[0];
handler->func.user->fci.params[1] = ¶ms[1];
/* call failed, pass internal buffer along */
status = PHP_OUTPUT_HANDLER_FAILURE;
}
- zend_fcall_info_args(&handler->func.user->fci, NULL TSRMLS_CC);
+ zval_ptr_dtor(¶ms[0]);
+ zval_ptr_dtor(¶ms[1]);
if (retval) {
zval_ptr_dtor(&retval);
}