lbarnaud Sat Aug 2 02:36:14 2008 UTC
Modified files:
/php-src/ext/zlib zlib.c
Log:
Avoid leaks when zlib streams can not be closed properly.
http://cvs.php.net/viewvc.cgi/php-src/ext/zlib/zlib.c?r1=1.219&r2=1.220&diff_format=u
Index: php-src/ext/zlib/zlib.c
diff -u php-src/ext/zlib/zlib.c:1.219 php-src/ext/zlib/zlib.c:1.220
--- php-src/ext/zlib/zlib.c:1.219 Thu Jul 3 12:21:25 2008
+++ php-src/ext/zlib/zlib.c Sat Aug 2 02:36:14 2008
@@ -20,7 +20,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zlib.c,v 1.219 2008/07/03 12:21:25 felipe Exp $ */
+/* $Id: zlib.c,v 1.220 2008/08/02 02:36:14 lbarnaud Exp $ */
#ifdef HAVE_CONFIG_H
# include "config.h"
@@ -36,6 +36,19 @@
ZEND_DECLARE_MODULE_GLOBALS(zlib);
+/* {{{ Memory management wrappers */
+
+static voidpf php_zlib_alloc(voidpf opaque, uInt items, uInt size)
+{
+ return (voidpf)safe_emalloc(items, size, 0);
+}
+
+static void php_zlib_free(voidpf opaque, voidpf address)
+{
+ efree((void*)address);
+}
+/* }}} */
+
/* {{{ php_zlib_output_conflict_check() */
int php_zlib_output_conflict_check(zval *handler_name TSRMLS_DC)
{
@@ -104,12 +117,16 @@
php_output_handler *php_zlib_output_handler_init(zval *handler_name, size_t
chunk_size, int flags TSRMLS_DC)
{
php_output_handler *h = NULL;
+ php_zlib_context *ctx;
if (!ZLIBG(output_compression)) {
ZLIBG(output_compression) = chunk_size ? chunk_size :
PHP_OUTPUT_HANDLER_DEFAULT_SIZE;
}
if ((h = php_output_handler_create_internal(handler_name,
php_zlib_output_handler, chunk_size, flags TSRMLS_CC))) {
- php_output_handler_set_context(h, ecalloc(1,
sizeof(php_zlib_context)), php_zlib_output_handler_dtor TSRMLS_CC);
+ ctx = (php_zlib_context *) ecalloc(1, sizeof(php_zlib_context));
+ ctx->Z.zalloc = php_zlib_alloc;
+ ctx->Z.zfree = php_zlib_free;
+ php_output_handler_set_context(h, ctx,
php_zlib_output_handler_dtor TSRMLS_CC);
}
return h;
@@ -264,6 +281,8 @@
z_stream Z;
memset(&Z, 0, sizeof(z_stream));
+ Z.zalloc = php_zlib_alloc;
+ Z.zfree = php_zlib_free;
if (Z_OK == (status = deflateInit2(&Z, level, Z_DEFLATED, encoding,
MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY))) {
*out_len = PHP_ZLIB_BUFFER_SIZE_GUESS(in_len);
@@ -347,6 +366,9 @@
z_stream Z;
memset(&Z, 0, sizeof(z_stream));
+ Z.zalloc = php_zlib_alloc;
+ Z.zfree = php_zlib_free;
+
if (in_len) {
retry_raw_inflate:
status = inflateInit2(&Z, encoding);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php