summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2000-11-02 16:46:30 +0000
committerZeev Suraski <zeev@php.net>2000-11-02 16:46:30 +0000
commit816f1f790332f35cff8519c014773ea4930bb84f (patch)
tree73418681337658dad8a00c20b670ec72530a1b71
parenta44361a7695cc02aca01275bacca628c5d3c9dae (diff)
downloadphp-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
-rw-r--r--NEWS6
-rw-r--r--ext/standard/output.c44
-rw-r--r--main/output.c44
3 files changed, 47 insertions, 47 deletions
diff --git a/NEWS b/NEWS
index 8eeaf23e61..b1b236690a 100644
--- a/NEWS
+++ b/NEWS
@@ -3,9 +3,13 @@ PHP 4.0 NEWS
?? ??? 2000, Version 4.0.4
+
+- Fixed a bug that caused PHP not to properly flush its output buffer, if more
+ than one output buffer was used. (Zeev)
- Fixed a bug that could draw the shutdown sequence of the PHP Apache module
into an endless loop, under certain circumstances. It could cause Apache
- processes under Solaris to get stuck, especially when using output buffering.
+ processes under Solaris to get stuck, especially when using output
+ buffering. (Zeev)
- Add support for serializing references (Stas)
- Fixed conflict with OpenLDAP and Oracle 8.1.x (Jani)
- parse_ini_file() supports a new optional 2nd argument that instructs it
diff --git a/ext/standard/output.c b/ext/standard/output.c
index bba0c1b6cc..109f2850a2 100644
--- a/ext/standard/output.c
+++ b/ext/standard/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;
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;