diff options
author | Zeev Suraski <zeev@php.net> | 2000-11-02 16:46:30 +0000 |
---|---|---|
committer | Zeev Suraski <zeev@php.net> | 2000-11-02 16:46:30 +0000 |
commit | 816f1f790332f35cff8519c014773ea4930bb84f (patch) | |
tree | 73418681337658dad8a00c20b670ec72530a1b71 /main | |
parent | a44361a7695cc02aca01275bacca628c5d3c9dae (diff) | |
download | php-git-816f1f790332f35cff8519c014773ea4930bb84f.tar.gz |
- Fixed a bug that caused PHP not to properly flush its output buffer, if more
than one output buffer was used
Diffstat (limited to 'main')
-rw-r--r-- | main/output.c | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/main/output.c b/main/output.c index bba0c1b6cc..109f2850a2 100644 --- a/main/output.c +++ b/main/output.c @@ -31,7 +31,6 @@ static int php_ub_body_write_no_header(const char *str, uint str_length); static int php_b_body_write(const char *str, uint str_length); static void php_ob_init(uint initial_size, uint block_size, zval *output_handler); -static void php_ob_destroy(void); static void php_ob_append(const char *text, uint text_length); #if 0 static void php_ob_prepend(const char *text, uint text_length); @@ -108,6 +107,7 @@ PHPAPI void php_end_ob_buffer(int send_buffer) char *final_buffer=NULL; int final_buffer_length=0; zval *alternate_buffer=NULL; + char *to_be_destroyed_buffer; SLS_FETCH(); OLS_FETCH(); @@ -146,6 +146,7 @@ PHPAPI void php_end_ob_buffer(int send_buffer) final_buffer = OG(active_ob_buffer).buffer; final_buffer_length = OG(active_ob_buffer).text_length; } + if (OG(nesting_level)==1) { /* end buffering */ if (SG(headers_sent) && !SG(request_info).headers_only) { OG(php_body_write) = php_ub_body_write_no_header; @@ -153,13 +154,31 @@ PHPAPI void php_end_ob_buffer(int send_buffer) OG(php_body_write) = php_ub_body_write; } } + + to_be_destroyed_buffer = OG(active_ob_buffer).buffer; + + if (OG(nesting_level)>1) { /* restore previous buffer */ + php_ob_buffer *ob_buffer_p; + + zend_stack_top(&OG(ob_buffers), (void **) &ob_buffer_p); + OG(active_ob_buffer) = *ob_buffer_p; + zend_stack_del_top(&OG(ob_buffers)); + if (OG(nesting_level)==2) { /* destroy the stack */ + zend_stack_destroy(&OG(ob_buffers)); + } + } + if (send_buffer) { OG(php_body_write)(final_buffer, final_buffer_length); } + if (alternate_buffer) { zval_ptr_dtor(&alternate_buffer); } - php_ob_destroy(); + + efree(to_be_destroyed_buffer); + + OG(nesting_level)--; } @@ -228,27 +247,6 @@ static void php_ob_init(uint initial_size, uint block_size, zval *output_handler } -static void php_ob_destroy() -{ - OLS_FETCH(); - - if (OG(nesting_level)>0) { - efree(OG(active_ob_buffer).buffer); - if (OG(nesting_level)>1) { /* restore previous buffer */ - php_ob_buffer *ob_buffer_p; - - zend_stack_top(&OG(ob_buffers), (void **) &ob_buffer_p); - OG(active_ob_buffer) = *ob_buffer_p; - zend_stack_del_top(&OG(ob_buffers)); - if (OG(nesting_level)==2) { /* destroy the stack */ - zend_stack_destroy(&OG(ob_buffers)); - } - } - } - OG(nesting_level)--; -} - - static void php_ob_append(const char *text, uint text_length) { char *target; |