diff options
author | Greg Beaver <cellog@php.net> | 2009-02-03 18:56:26 +0000 |
---|---|---|
committer | Greg Beaver <cellog@php.net> | 2009-02-03 18:56:26 +0000 |
commit | e26a3a8ed36fb88b768a1964e23da7cb7bc4f4f0 (patch) | |
tree | 718e09ecdf3bdca4391b20ee29217a6af4583ffe /ext/bz2 | |
parent | fd5be66d13b86fd6638279a4695ab874bbe14c39 (diff) | |
download | php-git-e26a3a8ed36fb88b768a1964e23da7cb7bc4f4f0.tar.gz |
Re-Fixed bug #46026 (bz2.decompress/zlib.inflate filter tries to decompress after end of stream)
Diffstat (limited to 'ext/bz2')
-rw-r--r-- | ext/bz2/bz2_filter.c | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/ext/bz2/bz2_filter.c b/ext/bz2/bz2_filter.c index ecb57dfe15..3ec29e4d4b 100644 --- a/ext/bz2/bz2_filter.c +++ b/ext/bz2/bz2_filter.c @@ -353,11 +353,14 @@ static php_stream_filter *php_bz2_filter_create(const char *filtername, zval *fi if (Z_TYPE_P(filterparams) == IS_ARRAY || Z_TYPE_P(filterparams) == IS_OBJECT) { if (SUCCESS == zend_hash_find(HASH_OF(filterparams), "concatenated", sizeof("concatenated"), (void **) &tmpzval) ) { - SEPARATE_ZVAL(tmpzval); - convert_to_boolean_ex(tmpzval); - data->expect_concatenated = Z_LVAL_PP(tmpzval); - zval_ptr_dtor(tmpzval); - tmpzval = NULL; + zval tmp, *tmp2; + + tmp = **tmpzval; + zval_copy_ctor(&tmp); + tmp2 = &tmp; + convert_to_boolean_ex(&tmp2); + data->expect_concatenated = Z_LVAL(tmp); + tmpzval = NULL; } zend_hash_find(HASH_OF(filterparams), "small", sizeof("small"), (void **) &tmpzval); @@ -366,10 +369,13 @@ static php_stream_filter *php_bz2_filter_create(const char *filtername, zval *fi } if (tmpzval) { - SEPARATE_ZVAL(tmpzval); - convert_to_boolean_ex(tmpzval); - data->small_footprint = Z_LVAL_PP(tmpzval); - zval_ptr_dtor(tmpzval); + zval tmp, *tmp2; + + tmp = **tmpzval; + zval_copy_ctor(&tmp); + tmp2 = &tmp; + convert_to_boolean_ex(&tmp2); + data->small_footprint = Z_LVAL(tmp); } } @@ -385,26 +391,31 @@ static php_stream_filter *php_bz2_filter_create(const char *filtername, zval *fi if (Z_TYPE_P(filterparams) == IS_ARRAY || Z_TYPE_P(filterparams) == IS_OBJECT) { if (zend_hash_find(HASH_OF(filterparams), "blocks", sizeof("blocks"), (void**) &tmpzval) == SUCCESS) { /* How much memory to allocate (1 - 9) x 100kb */ - SEPARATE_ZVAL(tmpzval); - convert_to_long_ex(tmpzval); - if (Z_LVAL_PP(tmpzval) < 1 || Z_LVAL_PP(tmpzval) > 9) { + zval tmp; + + tmp = **tmpzval; + zval_copy_ctor(&tmp); + convert_to_long(&tmp); + if (Z_LVAL(tmp) < 1 || Z_LVAL(tmp) > 9) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter given for number of blocks to allocate. (%ld)", Z_LVAL_PP(tmpzval)); } else { - blockSize100k = Z_LVAL_PP(tmpzval); + blockSize100k = Z_LVAL(tmp); } - zval_ptr_dtor(tmpzval); } if (zend_hash_find(HASH_OF(filterparams), "work", sizeof("work"), (void**) &tmpzval) == SUCCESS) { /* Work Factor (0 - 250) */ - SEPARATE_ZVAL(tmpzval); - convert_to_long_ex(tmpzval); - if (Z_LVAL_PP(tmpzval) < 0 || Z_LVAL_PP(tmpzval) > 250) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter given for work factor. (%ld)", Z_LVAL_PP(tmpzval)); + zval tmp; + + tmp = **tmpzval; + zval_copy_ctor(&tmp); + convert_to_long(&tmp); + + if (Z_LVAL(tmp) < 0 || Z_LVAL(tmp) > 250) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter given for work factor. (%ld)", Z_LVAL(tmp)); } else { - workFactor = Z_LVAL_PP(tmpzval); + workFactor = Z_LVAL(tmp); } - zval_ptr_dtor(tmpzval); } } } |