]> granicus.if.org Git - php/commitdiff
- Fixed bug #46897: ob_flush() should fail to flush unerasable buffers
authorDavid Coallier <davidc@php.net>
Fri, 13 Feb 2009 11:48:17 +0000 (11:48 +0000)
committerDavid Coallier <davidc@php.net>
Fri, 13 Feb 2009 11:48:17 +0000 (11:48 +0000)
- Added test for bug46897
- A memleak has been identified while fixing this bug but the changes
  made by this commit do not affect ob_get_clean where the memleak (which
  is fixed in HEAD with the new handler) resides.
- [DOC] New noticed is outputted in ob_flush when the buffer is unerasable

main/output.c
tests/output/bug46897.phpt [new file with mode: 0644]

index 28a6cea1a4d9cc3d5c4f2aa43822ea36dc3ce5cd..24e879febe9997b84718e1bda0c9d18389334191 100644 (file)
@@ -774,6 +774,11 @@ PHP_FUNCTION(ob_flush)
                RETURN_FALSE;
        }
        
+       if (!OG(active_ob_buffer).status && !OG(active_ob_buffer).erase) {
+               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to flush buffer %s.", OG(active_ob_buffer).handler_name);
+               RETURN_FALSE;
+       }
+       
        php_end_ob_buffer(1, 1 TSRMLS_CC);
        RETURN_TRUE;
 }
diff --git a/tests/output/bug46897.phpt b/tests/output/bug46897.phpt
new file mode 100644 (file)
index 0000000..6cfb102
--- /dev/null
@@ -0,0 +1,27 @@
+--TEST--
+Bug #46897: ob_flush() should fail to flush unerasable buffers
+--FILE--
+<?php
+function callback($string) {
+    static $callback_invocations;
+    $callback_invocations++;
+    return "[callback:$callback_invocations]$string\n";
+}
+
+ob_start('callback', 0, false);
+
+echo "Attempt to flush unerasable buffer - should fail...";
+var_dump(ob_flush());
+// Check content of buffer after flush - if flush failed it should still contain the string above.
+var_dump(ob_get_contents());
+echo 'Done';
+?>
+--EXPECTF--
+[callback:1]Attempt to flush unerasable buffer - should fail...
+Notice: ob_flush(): failed to flush buffer callback. in %s on line %d
+bool(false)
+string(%d) "Attempt to flush unerasable buffer - should fail...
+Notice: ob_flush(): failed to flush buffer callback. in %s on line %d
+bool(false)
+"
+Done