#24951 [Csd]: ob_flash() and ob_clean() destroy output handler
ID: 24951
User updated by: d dot stogov at turck dot spb dot ru
Reported By: d dot stogov at turck dot spb dot ru
Status: Closed
Bug Type: Output Control
Operating System: Linux
PHP Version: 4.3.3RC2
Assigned To: iliaa
New Comment:
I have tested path with PHP-4.3.2.
All works fine.
Previous Comments:
------------------------------------------------------------------------
[2003-08-08 18:44:46] iliaa@php.net
This bug has been fixed in CVS.
In case this was a PHP problem, snapshots of the sources are packaged
every three hours; this change will be in the next snapshot. You can
grab the snapshot at http://snaps.php.net/.
In case this was a documentation problem, the fix will show up soon at
http://www.php.net/manual/.
In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites in short time.
Thank you for the report, and for helping us make PHP better.
------------------------------------------------------------------------
[2003-08-08 11:49:39] iliaa@php.net
The following patch appears to address the problem, please try it and
let me know if it works for you as well.
http://bb.prohost.org/bug24951.txt
------------------------------------------------------------------------
[2003-08-08 01:09:54] d dot stogov at turck dot spb dot ru
Seems to work with 4.3.3RC3 on Windows, but I think it is not fixed.
See into code of "php_end_ob_buffer". You destroy "output_handler" on
each flush. (main/output.c:250)
The second call to "php_end_ob_buffer" will work only if memory which
was used for "output_handler" was not changed.
May be I am not right, but check it.
------------------------------------------------------------------------
[2003-08-05 11:05:28] sniper@php.net
Take that back, with latest CVS I get this output:
[Hello from t1 1 Hello from t1 2 ]
[Hello from t2 1 Hello from t2 2 ]
Hello from t3 2 ]
AFAIK, this is the expected output too..the
------------------------------------------------------------------------
[2003-08-05 08:31:35] d dot stogov at turck dot spb dot ru
Description:
------------
The C function "php_end_ob_buffer" from "main/output.c" destroys
output_handler on first call so the second call to output_handler is
not possible. "php_end_ob_buffer" is called by "ob_flush()" and
"ob_clean()" those must not destroy output handler.
Look into line 250:
zval_ptr_dtor(&OG(active_ob_buffer).output_handler);
The same error is in PHP-4.3.3RC2 too.
Reproduce code:
---------------
<?php
function test($s,$mode) {
return (($mode & PHP_OUTPUT_HANDLER_START)?"[":"").
$s.
(($mode & PHP_OUTPUT_HANDLER_END)?"]\n":"");
}
function t1() {
ob_start("test");
echo "Hello from t1 1 ";
echo "Hello from t1 2 ";
ob_end_flush();
}
function t2() {
ob_start("test");
echo "Hello from t2 1 ";
ob_flush();
echo "Hello from t2 2 ";
ob_end_flush();
}
function t3() {
ob_start("test");
echo "Hello from t3 1 ";
ob_clean();
echo "Hello from t3 2 ";
ob_end_flush();
}
t1(); echo "\n";
t2(); echo "\n";
t3(); echo "\n";
?>
Expected result:
----------------
[Hello from t1 1 Hello from t1 2 ]
[Hello from t2 1 Hello from t2 2]
[Hello from t3 2]
Actual result:
--------------
[Hello from t1 1 Hello from t1 2 ]
[Hello from t2 1 Hello from t2 2
Hello from t3 2
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=24951&edit=1
Thread (8 messages)