}
/* }}} */
-static void sapi_run_header_callback(void)
+static void sapi_run_header_callback(zval *callback)
{
int error;
zend_fcall_info fci;
char *callback_error = NULL;
zval retval;
- if (zend_fcall_info_init(&SG(callback_func), 0, &fci, &SG(fci_cache), NULL, &callback_error) == SUCCESS) {
+ if (zend_fcall_info_init(callback, 0, &fci, &SG(fci_cache), NULL, &callback_error) == SUCCESS) {
fci.retval = &retval;
error = zend_call_function(&fci, &SG(fci_cache));
SG(sapi_headers).http_status_line = NULL;
SG(sapi_headers).mimetype = NULL;
SG(headers_sent) = 0;
- SG(callback_run) = 0;
ZVAL_UNDEF(&SG(callback_func));
SG(read_post_bytes) = 0;
SG(request_info).request_body = NULL;
sapi_send_headers_free();
SG(sapi_started) = 0;
SG(headers_sent) = 0;
- SG(callback_run) = 0;
- zval_ptr_dtor(&SG(callback_func));
SG(request_info).headers_read = 0;
SG(global_request_time) = 0;
}
int retval;
int ret = FAILURE;
- if (SG(headers_sent) || SG(request_info).no_headers || SG(callback_run)) {
+ if (SG(headers_sent) || SG(request_info).no_headers) {
return SUCCESS;
}
SG(sapi_headers).send_default_content_type = 0;
}
- if (Z_TYPE(SG(callback_func)) != IS_UNDEF && !SG(callback_run)) {
- SG(callback_run) = 1;
- sapi_run_header_callback();
+ if (Z_TYPE(SG(callback_func)) != IS_UNDEF) {
+ zval cb;
+ ZVAL_COPY_VALUE(&cb, &SG(callback_func));
+ ZVAL_UNDEF(&SG(callback_func));
+ sapi_run_header_callback(&cb);
+ zval_ptr_dtor(&cb);
}
SG(headers_sent) = 1;