1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Fix GH-20906: Assertion failure when messing up output buffers

Closes GH-20908.
This commit is contained in:
ndossche
2026-01-11 15:06:06 +01:00
parent 6f91209260
commit 1709689256
5 changed files with 82 additions and 3 deletions

3
NEWS
View File

@@ -2,6 +2,9 @@ PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? ????, PHP 8.4.20
- Standard:
. Fixed bug GH-20906 (Assertion failure when messing up output buffers).
(ndossche)
12 Mar 2026, PHP 8.4.19

View File

@@ -1768,7 +1768,10 @@ PHP_FUNCTION(highlight_file)
}
if (i) {
php_output_start_default();
if (UNEXPECTED(php_output_start_default() != SUCCESS)) {
zend_throw_error(NULL, "Unable to start output handler");
RETURN_THROWS();
}
}
php_get_highlight_struct(&syntax_highlighter_ini);
@@ -1803,7 +1806,10 @@ PHP_FUNCTION(php_strip_whitespace)
Z_PARAM_PATH_STR(filename)
ZEND_PARSE_PARAMETERS_END();
php_output_start_default();
if (UNEXPECTED(php_output_start_default() != SUCCESS)) {
zend_throw_error(NULL, "Unable to start output handler");
RETURN_THROWS();
}
zend_stream_init_filename_ex(&file_handle, filename);
zend_save_lexical_state(&original_lex_state);
@@ -1840,7 +1846,10 @@ PHP_FUNCTION(highlight_string)
ZEND_PARSE_PARAMETERS_END();
if (i) {
php_output_start_default();
if (UNEXPECTED(php_output_start_default() != SUCCESS)) {
zend_throw_error(NULL, "Unable to start output handler");
RETURN_THROWS();
}
}
EG(error_reporting) = E_ERROR;

View File

@@ -0,0 +1,25 @@
--TEST--
GH-20906 (Assertion failure when messing up output buffers) - php_strip_whitespace
--CREDITS--
vi3tL0u1s
--FILE--
<?php
class A {
function __destruct() {
php_strip_whitespace(__FILE__);
echo "x";
$c = new A;
ob_start(function () use ($c) { return '/'; }, 1);
ob_start(function () use (&$c) { $c = new A; return '/'; }, 1);
}
}
try {
new A;
} catch (Throwable $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECTF--
%a
Fatal error: php_strip_whitespace(): Cannot use output buffering in output buffering display handlers in %s on line %d

View File

@@ -0,0 +1,21 @@
--TEST--
GH-20906 (Assertion failure when messing up output buffers) - highlight_file
--CREDITS--
vi3tL0u1s
--FILE--
<?php
class A {
function __destruct() {
highlight_file(__FILE__, true);
echo "x";
$c = new A;
ob_start(function () use ($c) { return '/'; }, 1);
ob_start(function () use (&$c) { $c = new A; return '/'; }, 1);
}
}
new A;
?>
--EXPECTF--
%a
Fatal error: highlight_file(): Cannot use output buffering in output buffering display handlers in %s on line %d

View File

@@ -0,0 +1,21 @@
--TEST--
GH-20906 (Assertion failure when messing up output buffers) - highlight_string
--CREDITS--
vi3tL0u1s
--FILE--
<?php
class A {
function __destruct() {
highlight_string(__FILE__, true);
echo "x";
$c = new A;
ob_start(function () use ($c) { return '/'; }, 1);
ob_start(function () use (&$c) { $c = new A; return '/'; }, 1);
}
}
new A;
?>
--EXPECTF--
%a
Fatal error: highlight_string(): Cannot use output buffering in output buffering display handlers in %s on line %d