summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2020-03-02 10:46:31 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2020-03-02 10:46:46 +0100
commitb9843c9418a1325c4e7dfbf678b3e221c815c130 (patch)
treeb1c71c76c28acf9cb0e5fac6298ce527d08782d6
parent533633deda78301c58b360841d02c061f2a6106e (diff)
parent2adf1c4d23467424012db1971d0a0a678d10d782 (diff)
downloadphp-git-b9843c9418a1325c4e7dfbf678b3e221c815c130.tar.gz
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fix #79332: php_istreams are never freed
-rw-r--r--NEWS1
-rw-r--r--ext/com_dotnet/com_persist.c11
-rw-r--r--ext/com_dotnet/tests/bug79332.phpt18
3 files changed, 20 insertions, 10 deletions
diff --git a/NEWS b/NEWS
index 21e25c71d4..da6a7c16c3 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,7 @@ PHP NEWS
. Fixed bug #79248 (Traversing empty VT_ARRAY throws com_exception). (cmb)
. Fixed bug #79299 (com_print_typeinfo prints duplicate variables). (Litiano
Moura)
+ . Fixed bug #79332 (php_istreams are never freed). (cmb)
- CURL:
. Fixed bug #79019 (Copied cURL handles upload empty file). (cmb)
diff --git a/ext/com_dotnet/com_persist.c b/ext/com_dotnet/com_persist.c
index f2d60c1e72..3283e59df7 100644
--- a/ext/com_dotnet/com_persist.c
+++ b/ext/com_dotnet/com_persist.c
@@ -248,13 +248,6 @@ static struct IStreamVtbl php_istream_vtbl = {
static void istream_destructor(php_istream *stm)
{
- if (stm->res) {
- zend_resource *res = stm->res;
- stm->res = NULL;
- zend_list_delete(res);
- return;
- }
-
if (stm->refcount > 0) {
CoDisconnectObject((IUnknown*)stm, 0);
}
@@ -268,7 +261,6 @@ static void istream_destructor(php_istream *stm)
PHP_COM_DOTNET_API IStream *php_com_wrapper_export_stream(php_stream *stream)
{
php_istream *stm = (php_istream*)CoTaskMemAlloc(sizeof(*stm));
- zval *tmp;
if (stm == NULL)
return NULL;
@@ -280,8 +272,7 @@ PHP_COM_DOTNET_API IStream *php_com_wrapper_export_stream(php_stream *stream)
stm->stream = stream;
GC_ADDREF(stream->res);
- tmp = zend_list_insert(stm, le_istream);
- stm->res = Z_RES_P(tmp);
+ stm->res = zend_register_resource(stm, le_istream);
return (IStream*)stm;
}
diff --git a/ext/com_dotnet/tests/bug79332.phpt b/ext/com_dotnet/tests/bug79332.phpt
new file mode 100644
index 0000000000..45856b5488
--- /dev/null
+++ b/ext/com_dotnet/tests/bug79332.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #79332 (php_istreams are never freed)
+--SKIPIF--
+<?php
+if (!extension_loaded('com_dotnet')) die('com_dotnet extension not available');
+?>
+--FILE--
+<?php
+$ph = new COMPersistHelper(null);
+try {
+ $ph->LoadFromStream(fopen(__FILE__, 'r'));
+} catch (com_exception $ex) {
+ // use hard-coded message to avoid localization issues
+ echo "A com_exception has been thrown\n";
+}
+?>
+--EXPECT--
+A com_exception has been thrown