com php-src: Fixed resource leak: main/php_streams.h main /streams/streams.c

From: Date: Thu, 31 Jul 2014 06:53:31 +0000
Subject: com php-src: Fixed resource leak: main/php_streams.h main /streams/streams.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-79690@lists.php.net to get a copy of this message
Commit: 449f3e645232055760c8ccca77498f83b88f5486 Author: Dmitry Stogov <dmitry@zend.com> Thu, 31 Jul 2014 10:53:31 +0400 Parents: 72753068873921ad4b970623c1e727f9a7d7b5eb Branches: phpng Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=449f3e645232055760c8ccca77498f83b88f5486 Log: Fixed resource leak Changed paths: M main/php_streams.h M main/streams/streams.c Diff: diff --git a/main/php_streams.h b/main/php_streams.h index 2a142b9..fac15ce 100644 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -202,9 +202,7 @@ struct _php_stream { * PHP_STREAM_FCLOSE_XXX as appropriate */ int fclose_stdiocast; FILE *stdiocast; /* cache this, otherwise we might leak! */ -#if ZEND_DEBUG int __exposed; /* non-zero if exposed as a zval somewhere */ -#endif char *orig_path; php_stream_context *context; @@ -243,17 +241,12 @@ END_EXTERN_C() #define php_stream_alloc(ops, thisptr, persistent_id, mode) _php_stream_alloc((ops), (thisptr), (persistent_id), (mode) STREAMS_CC TSRMLS_CC) #define php_stream_get_resource_id(stream) ((php_stream *)(stream))->res->handle -#if ZEND_DEBUG /* use this to tell the stream that it is OK if we don't explicitly close it */ -# define php_stream_auto_cleanup(stream) { (stream)->__exposed++; } +#define php_stream_auto_cleanup(stream) { (stream)->__exposed++; } /* use this to assign the stream to a zval and tell the stream that is * has been exported to the engine; it will expect to be closed automatically * when the resources are auto-destructed */ -# define php_stream_to_zval(stream, zval) { ZVAL_RES(zval, (stream)->res); (stream)->__exposed++; } -#else -# define php_stream_auto_cleanup(stream) /* nothing */ -# define php_stream_to_zval(stream, zval) { ZVAL_RES(zval, (stream)->res); } -#endif +#define php_stream_to_zval(stream, zval) { ZVAL_RES(zval, (stream)->res); (stream)->__exposed++; } #define php_stream_from_zval(xstr, pzval) ZEND_FETCH_RESOURCE2((xstr), php_stream *, (pzval), -1, "stream", php_file_le_stream(), php_file_le_pstream()) #define php_stream_from_zval_no_verify(xstr, pzval) (xstr) = (php_stream*)zend_fetch_resource((pzval) TSRMLS_CC, -1, "stream", NULL, 2, php_file_le_stream(), php_file_le_pstream()) diff --git a/main/streams/streams.c b/main/streams/streams.c index f305fe8..648a0d8 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -466,6 +466,10 @@ fprintf(stderr, "stream_free: %s:%p[%s] preserve_handle=%d release_cast=%d remov //??? while (zend_list_delete(stream->res) == SUCCESS) {} //??? stream->res->gc.refcount = 0; zend_list_close(stream->res); + if (!stream->__exposed) { + zend_list_delete(stream->res); + stream->res = NULL; + } } if (close_options & PHP_STREAM_FREE_CALL_DTOR) {

« previous php.cvs (#79690) next »