]> granicus.if.org Git - php/commitdiff
- Fixed zlib.deflate compress filter to actually accpet level parameter.
authorJani Taskinen <jani@php.net>
Mon, 31 Aug 2009 21:18:55 +0000 (21:18 +0000)
committerJani Taskinen <jani@php.net>
Mon, 31 Aug 2009 21:18:55 +0000 (21:18 +0000)
NEWS
ext/zlib/tests/zlib_filter_deflate2.phpt [new file with mode: 0644]
ext/zlib/zlib_filter.c

diff --git a/NEWS b/NEWS
index f79275d629f2616d337879da20389ff355d747b7..9738de30ccaa25f8a676c2a92599e19fce43f3fb 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ PHP                                                                        NEWS
 ?? ??? 2009, PHP 5.2.11
 - Added missing sanity checks around exif processing (Ilia)
 
+- Fixed zlib.deflate compress filter to actually accpet level parameter. (Jani)
 - Fixed leak on error in popen/exec (and related functions on Windows. (Pierre)
 
 - Fixed bug #49361 (wordwrap() wraps incorrectly on end of line boundaries). 
diff --git a/ext/zlib/tests/zlib_filter_deflate2.phpt b/ext/zlib/tests/zlib_filter_deflate2.phpt
new file mode 100644 (file)
index 0000000..764a760
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+zlib.deflate (with level parameter set)
+--SKIPIF--
+<?php if (!extension_loaded("zlib")) print "skip"; ?>
+--FILE--
+<?php
+$text = 'I am the very model of a modern major general, I\'ve information vegetable, animal, and mineral.';
+
+$fp = fopen('php://stdout', 'w');
+stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, array('level' => 9));
+fwrite($fp, $text);
+fclose($fp);
+
+?> 
+--EXPECT-- 
+\1dËA\ e\80 \fDÑ«ÌÎ\8dñ\1e\1c£\86\ 11´M\1aBâíUv\7fñ_\82(ÆELÆ\ 3õÌ\ e/\90\95aP¹=Pi\fé;Ò6\89fÅCe4·\8fU\ e9;w\88\1f±\fm\v\1c
index 1e1d6029d45dce832344d133b1db98cc525430ee..cd45d2329ec738bdc0e85e819ae7c6436b1bcc4f 100644 (file)
@@ -353,7 +353,7 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f
 
 
                if (filterparams) {
-                       zval **tmpzval;
+                       zval **tmpzval, tmp;
 
                        /* filterparams can either be a scalar value to indicate compression level (shortcut method)
                Or can be a hash containing one or more of 'window', 'memory', and/or 'level' members. */
@@ -362,8 +362,6 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f
                                case IS_ARRAY:
                                case IS_OBJECT:
                                        if (zend_hash_find(HASH_OF(filterparams), "memory", sizeof("memory"), (void**) &tmpzval) == SUCCESS) {
-                                               zval tmp;
-               
                                                tmp = **tmpzval;
                                                zval_copy_ctor(&tmp);
                                                convert_to_long(&tmp);
@@ -377,8 +375,6 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f
                                        }
 
                                        if (zend_hash_find(HASH_OF(filterparams), "window", sizeof("window"), (void**) &tmpzval) == SUCCESS) {
-                                               zval tmp;
-               
                                                tmp = **tmpzval;
                                                zval_copy_ctor(&tmp);
                                                convert_to_long(&tmp);
@@ -392,6 +388,8 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f
                                        }
 
                                        if (zend_hash_find(HASH_OF(filterparams), "level", sizeof("level"), (void**) &tmpzval) == SUCCESS) {
+                                               tmp = **tmpzval;
+
                                                /* Psuedo pass through to catch level validating code */
                                                goto factory_setlevel;
                                        }
@@ -399,19 +397,16 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f
                                case IS_STRING:
                                case IS_DOUBLE:
                                case IS_LONG:
-                                       {
-                                               zval tmp;
-               
-                                               tmp = *filterparams;
-                                               zval_copy_ctor(&tmp);
-                                               convert_to_long(&tmp);
+                                       tmp = *filterparams;
 factory_setlevel:
-                                               /* Set compression level within reason (-1 == default, 0 == none, 1-9 == least to most compression */
-                                               if (Z_LVAL(tmp) < -1 || Z_LVAL(tmp) > 9) {
-                                                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid compression level specified. (%ld)", Z_LVAL(tmp));
-                                               } else {
-                                                       level = Z_LVAL(tmp);
-                                               }
+                                       zval_copy_ctor(&tmp);
+                                       convert_to_long(&tmp);
+
+                                       /* Set compression level within reason (-1 == default, 0 == none, 1-9 == least to most compression */
+                                       if (Z_LVAL(tmp) < -1 || Z_LVAL(tmp) > 9) {
+                                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid compression level specified. (%ld)", Z_LVAL(tmp));
+                                       } else {
+                                               level = Z_LVAL(tmp);
                                        }
                                        break;
                                default: