diff options
| author | krakjoe <joe.watkins@live.co.uk> | 2014-01-01 12:58:18 +0000 | 
|---|---|---|
| committer | krakjoe <joe.watkins@live.co.uk> | 2014-01-01 12:58:18 +0000 | 
| commit | 3c3ff434329d2f505b00a79bacfdef95ca96f0d2 (patch) | |
| tree | 5467b10dfc2f18b7140a29af8f0eb8b97b771e23 | |
| parent | 3b6afb1bd63ef92f9914867f04bedeea90e21789 (diff) | |
| download | php-git-3c3ff434329d2f505b00a79bacfdef95ca96f0d2.tar.gz | |
fix #66375 bad logic in sapi header callback routine
| -rw-r--r-- | main/SAPI.c | 43 | 
1 files changed, 25 insertions, 18 deletions
diff --git a/main/SAPI.c b/main/SAPI.c index dcb2da629a..9ffc2580a7 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -137,6 +137,7 @@ PHP_FUNCTION(header_register_callback)  		efree(callback_name);  		RETURN_FALSE;  	} +  	efree(callback_name);  	if (SG(callback_func)) { @@ -144,10 +145,10 @@ PHP_FUNCTION(header_register_callback)  		SG(fci_cache) = empty_fcall_info_cache;  	} -	Z_ADDREF_P(callback_func); -  	SG(callback_func) = callback_func; -	 + +	Z_ADDREF_P(SG(callback_func)); +  	RETURN_TRUE;  }  /* }}} */ @@ -156,24 +157,30 @@ static void sapi_run_header_callback(TSRMLS_D)  {  	int   error;  	zend_fcall_info fci; +	char *callback_name = NULL; +	char *callback_error = NULL;  	zval *retval_ptr = NULL; - -	fci.size = sizeof(fci); -	fci.function_table = EG(function_table); -	fci.object_ptr = NULL; -	fci.function_name = SG(callback_func); -	fci.retval_ptr_ptr = &retval_ptr; -	fci.param_count = 0; -	fci.params = NULL; -	fci.no_separation = 0; -	fci.symbol_table = NULL; - -	error = zend_call_function(&fci, &SG(fci_cache) TSRMLS_CC); -	if (error == FAILURE) { +	 +	if (zend_fcall_info_init(SG(callback_func), 0, &fci, &SG(fci_cache), &callback_name, &callback_error TSRMLS_CC) == SUCCESS) { +		fci.retval_ptr_ptr = &retval_ptr; +		 +		error = zend_call_function(&fci, &SG(fci_cache) TSRMLS_CC); +		if (error == FAILURE) { +			goto callback_failed; +		} else if (retval_ptr) { +			zval_ptr_dtor(&retval_ptr); +		} +	} else { +callback_failed:  		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not call the sapi_header_callback"); -	} else if (retval_ptr) { -		zval_ptr_dtor(&retval_ptr);  	} +	 +	if (callback_name) { +		efree(callback_name); +	} +	if (callback_error) { +		efree(callback_error); +	}	  }  SAPI_API void sapi_handle_post(void *arg TSRMLS_DC)  | 
