Merge branch 'PHP-8.0'

* PHP-8.0:
  Make sure output start filename is not freed early
This commit is contained in:
Nikita Popov 2020-10-16 17:29:22 +02:00
commit 808029c049
3 changed files with 27 additions and 6 deletions

View File

@ -0,0 +1,11 @@
--TEST--
Output start at eval()
--FILE--
<?php
eval('echo "Foo\n";');
header('Foo: Bar');
?>
--EXPECTF--
Foo
Warning: Cannot modify header information - headers already sent by (output started at %s(2) : eval()'d code:1) in %s on line %d

View File

@ -103,16 +103,20 @@ static size_t (*php_output_direct)(const char *str, size_t str_len) = php_output
static void php_output_header(void)
{
if (!SG(headers_sent)) {
if (!OG(output_start_filename)) {
if (!OG(output_start_filename_str)) {
if (zend_is_compiling()) {
OG(output_start_filename) = ZSTR_VAL(zend_get_compiled_filename());
OG(output_start_filename_str) = zend_get_compiled_filename();
OG(output_start_lineno) = zend_get_compiled_lineno();
} else if (zend_is_executing()) {
OG(output_start_filename) = zend_get_executed_filename();
OG(output_start_filename_str) = zend_get_executed_filename_ex();
OG(output_start_lineno) = zend_get_executed_lineno();
}
if (OG(output_start_filename_str)) {
zend_string_addref(OG(output_start_filename_str));
}
#if PHP_OUTPUT_DEBUG
fprintf(stderr, "!!! output started at: %s (%d)\n", OG(output_start_filename), OG(output_start_lineno));
fprintf(stderr, "!!! output started at: %s (%d)\n",
ZSTR_VAL(OG(output_start_filename_str)), OG(output_start_lineno));
#endif
}
if (!php_header()) {
@ -190,6 +194,11 @@ PHPAPI void php_output_deactivate(void)
}
zend_stack_destroy(&OG(handlers));
}
if (OG(output_start_filename_str)) {
zend_string_release(OG(output_start_filename_str));
OG(output_start_filename_str) = NULL;
}
}
/* }}} */
@ -749,7 +758,7 @@ PHPAPI void php_output_set_implicit_flush(int flush)
* Get the file name where output has started */
PHPAPI const char *php_output_get_start_filename(void)
{
return OG(output_start_filename);
return ZSTR_VAL(OG(output_start_filename_str));
}
/* }}} */

View File

@ -137,9 +137,10 @@ ZEND_BEGIN_MODULE_GLOBALS(output)
zend_stack handlers;
php_output_handler *active;
php_output_handler *running;
const char *output_start_filename;
const char *output_start_filename; /* TODO: Unused, remove */
int output_start_lineno;
int flags;
zend_string *output_start_filename_str;
ZEND_END_MODULE_GLOBALS(output)
PHPAPI ZEND_EXTERN_MODULE_GLOBALS(output)