diff options
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | ext/zlib/php_zlib.h | 1 | ||||
-rw-r--r-- | ext/zlib/tests/bug61287.phpt | 24 | ||||
-rw-r--r-- | ext/zlib/zlib.c | 2 |
4 files changed, 27 insertions, 1 deletions
@@ -61,6 +61,7 @@ PHP NEWS - Zlib: . Fixed bug #61139 (gzopen leaks when specifying invalid mode). (Nikita Popov) + . Fixed bug #61287 (A particular string fails to decompress). (Mike) 01 Mar 2012, PHP 5.4.0 diff --git a/ext/zlib/php_zlib.h b/ext/zlib/php_zlib.h index c265151abf..3d8c90cbf5 100644 --- a/ext/zlib/php_zlib.h +++ b/ext/zlib/php_zlib.h @@ -65,6 +65,7 @@ extern zend_module_entry php_zlib_module_entry; #define phpext_zlib_ptr zlib_module_ptr #ifdef ZTS +# include "TSRM.h" # define ZLIBG(v) TSRMG(zlib_globals_id, zend_zlib_globals *, v) #else # define ZLIBG(v) (zlib_globals.v) diff --git a/ext/zlib/tests/bug61287.phpt b/ext/zlib/tests/bug61287.phpt new file mode 100644 index 0000000000..769446a8cd --- /dev/null +++ b/ext/zlib/tests/bug61287.phpt @@ -0,0 +1,24 @@ +--TEST-- +bug #61287 - inflate needs the terminating null byte +--SKIPIF-- +<?php extension_loaded("zlib") or die("SKIP need zlib"); +--FILE-- +<?php +$array = array( + 'region_id' => 1, + 'discipline' => 23, + 'degrees' => array(), + 'country_id' => 27 +); + +$serialized = serialize($array); + +$deflated = gzdeflate($serialized, 9); +$inflated = gzinflate($deflated); + +echo strlen($inflated),"\n"; +?> +Done +--EXPECT-- +92 +Done diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index a9863152f7..8d0005592a 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -400,7 +400,7 @@ retry_raw_inflate: status = inflateInit2(&Z, encoding); if (Z_OK == status) { Z.next_in = (Bytef *) in_buf; - Z.avail_in = in_len; + Z.avail_in = in_len + 1; /* NOTE: data must be zero terminated */ switch (status = php_zlib_inflate_rounds(&Z, max_len, out_buf, out_len)) { case Z_STREAM_END: |