Browse Source

Fix bug #60768 Output buffer not discarded

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
pull/7/head
Michael Wallner 14 years ago
parent
commit
f32760bd40
  1. 11
      main/output.c
  2. 25
      tests/output/bug60768.phpt

11
main/output.c

@ -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;
}

25
tests/output/bug60768.phpt

@ -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
Loading…
Cancel
Save