com php-src: Fixed resource leak: main/php_streams.h main /streams/streams.c
| From: | Dmitry Stogov | 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) {