[PHP-CVS] com php-src: Re-fix bug #55544: ext/zlib/php_zlib.h ext/zlib/tests/bug55544.phpt ext/zlib/zlib.c

2012-07-24 Thread Xinchen Hui
Commit:4c1e2bbd6f744b4048d4e0540ecc5dbe005494fe
Author:Xinchen Hui larue...@php.net Tue, 24 Jul 2012 14:43:53 
+0800
Parents:   2abc4c2f6fabfc81d12380170dc5ec7be9314a61
Branches:  PHP-5.4

Link:   
http://git.php.net/?p=php-src.git;a=commitdiff;h=4c1e2bbd6f744b4048d4e0540ecc5dbe005494fe

Log:
Re-fix bug #55544

Bugs:
https://bugs.php.net/55544

Changed paths:
  M  ext/zlib/php_zlib.h
  A  ext/zlib/tests/bug55544.phpt
  M  ext/zlib/zlib.c


Diff:
diff --git a/ext/zlib/php_zlib.h b/ext/zlib/php_zlib.h
index 449dfed..ab67351 100644
--- a/ext/zlib/php_zlib.h
+++ b/ext/zlib/php_zlib.h
@@ -55,6 +55,7 @@ ZEND_BEGIN_MODULE_GLOBALS(zlib)
long output_compression_default;
char *output_handler;
php_zlib_context *ob_gzhandler;
+zend_bool handler_registered;
 ZEND_END_MODULE_GLOBALS(zlib);
 
 php_stream *php_stream_gzopen(php_stream_wrapper *wrapper, char *path, char 
*mode, int options, char **opened_path, php_stream_context *context STREAMS_DC 
TSRMLS_DC);
diff --git a/ext/zlib/tests/bug55544.phpt b/ext/zlib/tests/bug55544.phpt
new file mode 100644
index 000..ca4214a
Binary files /dev/null and b/ext/zlib/tests/bug55544.phpt differ
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index eac757b..7ff2b30 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -263,6 +263,8 @@ static php_output_handler 
*php_zlib_output_handler_init(const char *handler_name
ZLIBG(output_compression) = chunk_size ? chunk_size : 
PHP_OUTPUT_HANDLER_DEFAULT_SIZE;
}
 
+ZLIBG(handler_registered) = 1;
+
if ((h = php_output_handler_create_internal(handler_name, 
handler_name_len, php_zlib_output_handler, chunk_size, flags TSRMLS_CC))) {
php_output_handler_set_context(h, 
php_zlib_output_handler_context_init(TSRMLS_C), 
php_zlib_output_handler_context_dtor TSRMLS_CC);
}
@@ -964,9 +966,10 @@ static PHP_MSHUTDOWN_FUNCTION(zlib)
 static PHP_RINIT_FUNCTION(zlib)
 {
ZLIBG(compression_coding) = 0;
-   ZLIBG(output_compression) = ZLIBG(output_compression_default);
-
-   php_zlib_output_compression_start(TSRMLS_C);
+if (!ZLIBG(handler_registered)) {
+ZLIBG(output_compression) = ZLIBG(output_compression_default);
+php_zlib_output_compression_start(TSRMLS_C);
+}
 
return SUCCESS;
 }
@@ -976,6 +979,7 @@ static PHP_RINIT_FUNCTION(zlib)
 static PHP_RSHUTDOWN_FUNCTION(zlib)
 {
php_zlib_cleanup_ob_gzhandler_mess(TSRMLS_C);
+ZLIBG(handler_registered) = 0;
 
 return SUCCESS;
 }
@@ -1000,6 +1004,7 @@ static PHP_MINFO_FUNCTION(zlib)
 static ZEND_MODULE_GLOBALS_CTOR_D(zlib)
 {
zlib_globals-ob_gzhandler = NULL;
+zlib_globals-handler_registered = 0;
 }
 /* }}} */


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP-CVS] com php-src: Re-fix bug #55544: ext/zlib/php_zlib.h ext/zlib/tests/bug55544.phpt ext/zlib/zlib.c

2012-07-24 Thread Laruence
Hi:
   the fix is bad smell, I knew.  maybe you can find a better fix :) ?

  the problem is explained in #55544:
 here is the confusion(assuming -d output_handler=ob_gzhandler -d
zlib.output_compression=0) :

1. php.output_handler will change the ZLIGB(output_compression) before the zlib
RINIT
2. in zlib RINIT, we set the ZLIBG(output_compression) to default value(ini)

3. if we don't override the ZLIBG(output_compression), then in the
php_zlib_output_compression_start which will be called in RINT will
try to start
zlib compression handler (although it depends on the requeset header),
then, the
conflict warning will be threw.

4. if we override it, then it the php_zlib_output_compression_start, it will
return FALIURE, and no compression occurred(see the codes from my previous
reply)

so, the key problem is multi-featrues depends on one global flag -
ZLIBG(output_compression).

thanks


On Tue, Jul 24, 2012 at 2:43 PM, Xinchen Hui larue...@php.net wrote:
 Commit:4c1e2bbd6f744b4048d4e0540ecc5dbe005494fe
 Author:Xinchen Hui larue...@php.net Tue, 24 Jul 2012 14:43:53 
 +0800
 Parents:   2abc4c2f6fabfc81d12380170dc5ec7be9314a61
 Branches:  PHP-5.4

 Link:   
 http://git.php.net/?p=php-src.git;a=commitdiff;h=4c1e2bbd6f744b4048d4e0540ecc5dbe005494fe

 Log:
 Re-fix bug #55544

 Bugs:
 https://bugs.php.net/55544

 Changed paths:
   M  ext/zlib/php_zlib.h
   A  ext/zlib/tests/bug55544.phpt
   M  ext/zlib/zlib.c


 Diff:
 diff --git a/ext/zlib/php_zlib.h b/ext/zlib/php_zlib.h
 index 449dfed..ab67351 100644
 --- a/ext/zlib/php_zlib.h
 +++ b/ext/zlib/php_zlib.h
 @@ -55,6 +55,7 @@ ZEND_BEGIN_MODULE_GLOBALS(zlib)
 long output_compression_default;
 char *output_handler;
 php_zlib_context *ob_gzhandler;
 +zend_bool handler_registered;
  ZEND_END_MODULE_GLOBALS(zlib);

  php_stream *php_stream_gzopen(php_stream_wrapper *wrapper, char *path, char 
 *mode, int options, char **opened_path, php_stream_context *context 
 STREAMS_DC TSRMLS_DC);
 diff --git a/ext/zlib/tests/bug55544.phpt b/ext/zlib/tests/bug55544.phpt
 new file mode 100644
 index 000..ca4214a
 Binary files /dev/null and b/ext/zlib/tests/bug55544.phpt differ
 diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
 index eac757b..7ff2b30 100644
 --- a/ext/zlib/zlib.c
 +++ b/ext/zlib/zlib.c
 @@ -263,6 +263,8 @@ static php_output_handler 
 *php_zlib_output_handler_init(const char *handler_name
 ZLIBG(output_compression) = chunk_size ? chunk_size : 
 PHP_OUTPUT_HANDLER_DEFAULT_SIZE;
 }

 +ZLIBG(handler_registered) = 1;
 +
 if ((h = php_output_handler_create_internal(handler_name, 
 handler_name_len, php_zlib_output_handler, chunk_size, flags TSRMLS_CC))) {
 php_output_handler_set_context(h, 
 php_zlib_output_handler_context_init(TSRMLS_C), 
 php_zlib_output_handler_context_dtor TSRMLS_CC);
 }
 @@ -964,9 +966,10 @@ static PHP_MSHUTDOWN_FUNCTION(zlib)
  static PHP_RINIT_FUNCTION(zlib)
  {
 ZLIBG(compression_coding) = 0;
 -   ZLIBG(output_compression) = ZLIBG(output_compression_default);
 -
 -   php_zlib_output_compression_start(TSRMLS_C);
 +if (!ZLIBG(handler_registered)) {
 +ZLIBG(output_compression) = ZLIBG(output_compression_default);
 +php_zlib_output_compression_start(TSRMLS_C);
 +}

 return SUCCESS;
  }
 @@ -976,6 +979,7 @@ static PHP_RINIT_FUNCTION(zlib)
  static PHP_RSHUTDOWN_FUNCTION(zlib)
  {
 php_zlib_cleanup_ob_gzhandler_mess(TSRMLS_C);
 +ZLIBG(handler_registered) = 0;

  return SUCCESS;
  }
 @@ -1000,6 +1004,7 @@ static PHP_MINFO_FUNCTION(zlib)
  static ZEND_MODULE_GLOBALS_CTOR_D(zlib)
  {
 zlib_globals-ob_gzhandler = NULL;
 +zlib_globals-handler_registered = 0;
  }
  /* }}} */


 --
 PHP CVS Mailing List (http://www.php.net/)
 To unsubscribe, visit: http://www.php.net/unsub.php




-- 
Laruence  Xinchen Hui
http://www.laruence.com/

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php