summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 49feabc5ef..3dd8545c44 100644
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,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)
- DOM:
. Fixed bug #77569: (Write Access Violation in DomImplementation). (Nikita,
diff --git a/ext/com_dotnet/com_persist.c b/ext/com_dotnet/com_persist.c
index 0fee0efd43..743a441f70 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