#24951 [Asn->Csd]: ob_flash() and ob_clean() destroy output handler
| From: | iliaa@php.net | Date: | Fri, 08 Aug 2003 23:44:46 +0000 |
| Subject: | #24951 [Asn->Csd]: ob_flash() and ob_clean() destroy output handler | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-45608@lists.php.net to get a copy of this message | ||
ID: 24951
Updated by: iliaa@php.net
Reported By: d dot stogov at turck dot spb dot ru
-Status: Assigned
+Status: Closed
Bug Type: Output Control
Operating System: Linux
PHP Version: 4.3.3RC2
Assigned To: iliaa
New Comment:
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.
Previous Comments:
------------------------------------------------------------------------
[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