From 6bb0603c4fc2e26d4c44230232d46d1de313789e Mon Sep 17 00:00:00 2001 From: Jani Taskinen Date: Mon, 31 Aug 2009 21:18:55 +0000 Subject: [PATCH] - Fixed zlib.deflate compress filter to actually accpet level parameter. --- NEWS | 1 + ext/zlib/tests/zlib_filter_deflate2.phpt | 16 +++++++++++++ ext/zlib/zlib_filter.c | 29 ++++++++++-------------- 3 files changed, 29 insertions(+), 17 deletions(-) create mode 100644 ext/zlib/tests/zlib_filter_deflate2.phpt diff --git a/NEWS b/NEWS index ae130d06e7..459c045922 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,7 @@ PHP NEWS - Improved shared extension loading on OSX to use the standard Unix dlopen() API. (Scott) +- 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 possible bad caching of symlinked directories in the realpath cache diff --git a/ext/zlib/tests/zlib_filter_deflate2.phpt b/ext/zlib/tests/zlib_filter_deflate2.phpt new file mode 100644 index 0000000000..764a7606f4 --- /dev/null +++ b/ext/zlib/tests/zlib_filter_deflate2.phpt @@ -0,0 +1,16 @@ +--TEST-- +zlib.deflate (with level parameter set) +--SKIPIF-- + +--FILE-- + 9)); +fwrite($fp, $text); +fclose($fp); + +?> +--EXPECT-- +ËA€ DÑ«Ì΍ñ£†1´MBâíUvñ_‚(ÆELÆõÌ/•aP¹=Pi é;Ò6‰fÅCe4·U9;wˆ5ý± m / diff --git a/ext/zlib/zlib_filter.c b/ext/zlib/zlib_filter.c index f82504d97a..2c696cb5b9 100644 --- a/ext/zlib/zlib_filter.c +++ b/ext/zlib/zlib_filter.c @@ -352,7 +352,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. */ @@ -361,8 +361,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); @@ -376,8 +374,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); @@ -391,6 +387,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; } @@ -398,19 +396,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: -- 2.50.0