pollita Tue Jul 20 01:08:53 2004 EDT Modified files: /php-src/ext/zlib zlib_filter.c Log: Make persistency safe http://cvs.php.net/diff.php/php-src/ext/zlib/zlib_filter.c?r1=1.2&r2=1.3&ty=u Index: php-src/ext/zlib/zlib_filter.c diff -u php-src/ext/zlib/zlib_filter.c:1.2 php-src/ext/zlib/zlib_filter.c:1.3 --- php-src/ext/zlib/zlib_filter.c:1.2 Sun Jul 18 09:23:40 2004 +++ php-src/ext/zlib/zlib_filter.c Tue Jul 20 01:08:52 2004 @@ -16,14 +16,16 @@ +----------------------------------------------------------------------+ */ -/* $Id: zlib_filter.c,v 1.2 2004/07/18 13:23:40 wez Exp $ */ +/* $Id: zlib_filter.c,v 1.3 2004/07/20 05:08:52 pollita Exp $ */ #include "php.h" #include "php_zlib.h" /* {{{ data structure */ +/* Passed as opaque in malloc callbacks */ typedef struct _php_zlib_filter_data { + int persistent; z_stream strm; char *inbuf; size_t inbuf_len; @@ -37,12 +39,12 @@ static voidpf php_zlib_alloc(voidpf opaque, uInt items, uInt size) { - return (voidpf)safe_emalloc(items, size, 0); + return (voidpf)pemalloc(items * size, ((php_zlib_filter_data*)opaque)->persistent); } static void php_zlib_free(voidpf opaque, voidpf address) { - efree((void*)address); + pefree((void*)address, ((php_zlib_filter_data*)opaque)->persistent); } /* }}} */ @@ -140,9 +142,9 @@ if (thisfilter && thisfilter->abstract) { php_zlib_filter_data *data = thisfilter->abstract; inflateEnd(&(data->strm)); - efree(data->inbuf); - efree(data->outbuf); - efree(data); + pefree(data->inbuf, data->persistent); + pefree(data->outbuf, data->persistent); + pefree(data, data->persistent); } } @@ -248,9 +250,9 @@ if (thisfilter && thisfilter->abstract) { php_zlib_filter_data *data = thisfilter->abstract; deflateEnd(&(data->strm)); - efree(data->inbuf); - efree(data->outbuf); - efree(data); + pefree(data->inbuf, data->persistent); + pefree(data->outbuf, data->persistent); + pefree(data, data->persistent); } } @@ -270,13 +272,8 @@ php_zlib_filter_data *data; int status; - if (persistent) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "this filter is not safe to use with a persistent stream"); - return NULL; - } - /* Create this filter */ - data = ecalloc(1, sizeof(php_zlib_filter_data)); + data = pecalloc(1, sizeof(php_zlib_filter_data), persistent); /* Circular reference */ data->strm.opaque = (voidpf) data; @@ -284,9 +281,9 @@ data->strm.zalloc = (alloc_func) php_zlib_alloc; data->strm.zfree = (free_func) php_zlib_free; data->strm.avail_out = data->outbuf_len = data->inbuf_len = 2048; - data->strm.next_in = data->inbuf = (Bytef *) emalloc(data->inbuf_len); + data->strm.next_in = data->inbuf = (Bytef *) pemalloc(data->inbuf_len, persistent); data->strm.avail_in = 0; - data->strm.next_out = data->outbuf = (Bytef *) emalloc(data->outbuf_len); + data->strm.next_out = data->outbuf = (Bytef *) pemalloc(data->outbuf_len, persistent); data->strm.data_type = Z_ASCII; if (strcasecmp(filtername, "zlib.inflate") == 0) { @@ -384,9 +381,9 @@ if (status != Z_OK) { /* Unspecified (probably strm) error, let stream-filter error do its own whining */ - efree(data->strm.next_in); - efree(data->strm.next_out); - efree(data); + pefree(data->strm.next_in, persistent); + pefree(data->strm.next_out, persistent); + pefree(data, persistent); return NULL; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php