From: Dmitry Stogov Date: Thu, 31 Jul 2014 06:53:31 +0000 (+0400) Subject: Fixed resource leak X-Git-Tag: POST_PHPNG_MERGE~41^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=449f3e645232055760c8ccca77498f83b88f5486;p=php Fixed resource leak --- diff --git a/main/php_streams.h b/main/php_streams.h index 2a142b99c2..fac15ce3e4 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 f305fe8044..648a0d8c6d 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) {