]> granicus.if.org Git - php/commitdiff
Fix bug #60768 Output buffer not discarded
authorMichael Wallner <mike@php.net>
Mon, 16 Jan 2012 17:51:35 +0000 (17:51 +0000)
committerMichael Wallner <mike@php.net>
Mon, 16 Jan 2012 17:51:35 +0000 (17:51 +0000)
 in php_output_handler_op():
  * if appending to buffer succeeds, just return HANDLER_NO_DATA
    and do nothing else
  * if a zero sized string or true is returned from the handler
    function, reset the context as well as the handler's buffer

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

index 1ab4d7dbf9fda5adb324c9dfccae210a9e3c42f9..4697cbfb0d68aadd30bd2a274484c47d22b48eca 100644 (file)
@@ -885,7 +885,8 @@ static inline php_output_handler_status_t php_output_handler_op(php_output_handl
 
        /* storable? */
        if (php_output_handler_append(handler, &context->in TSRMLS_CC) && !context->op) {
-               status = PHP_OUTPUT_HANDLER_NO_DATA;
+               context->op = original_op;
+               return PHP_OUTPUT_HANDLER_NO_DATA;
        } else {
                /* need to start? */
                if (!(handler->flags & PHP_OUTPUT_HANDLER_STARTED)) {
@@ -961,13 +962,13 @@ static inline php_output_handler_status_t php_output_handler_op(php_output_handl
                        handler->buffer.used = 0;
                        handler->buffer.size = 0;
                        break;
-               case PHP_OUTPUT_HANDLER_SUCCESS:
-                       /* no more buffered data */
-                       handler->buffer.used = 0;
-                       break;
                case PHP_OUTPUT_HANDLER_NO_DATA:
                        /* handler ate all */
                        php_output_context_reset(context);
+                       /* no break */
+               case PHP_OUTPUT_HANDLER_SUCCESS:
+                       /* no more buffered data */
+                       handler->buffer.used = 0;
                        break;
        }
 
diff --git a/tests/output/bug60768.phpt b/tests/output/bug60768.phpt
new file mode 100644 (file)
index 0000000..2527e8e
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Bug #60768 Output buffer not discarded
+--FILE--
+<?php
+
+global $storage;
+
+ob_start(function($buffer) use (&$storage) { $storage .= $buffer; }, 20);
+
+echo str_repeat("0", 20); // fill in the buffer
+
+for($i = 0; $i < 10; $i++) {
+    echo str_pad($i, 9, ' ', STR_PAD_LEFT) . "\n"; // full buffer dumped every time
+}
+
+ob_end_flush();
+
+printf("Output size: %d, expected %d\n", strlen($storage), 20 + 10 * 10);
+
+?>
+DONE
+--EXPECT--
+Output size: 120, expected 120
+DONE
+