summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2019-03-18 18:47:34 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2019-03-18 19:21:38 +0100
commit41bc51ce2d217aa7aca85b4be289bebf91813423 (patch)
tree60dd69a37c40a1a8c5e0a46f422ea3a38b806832
parentf21c0549030762f8403f57eef375af9f946133e7 (diff)
downloadphp-git-41bc51ce2d217aa7aca85b4be289bebf91813423.tar.gz
Fix #77578: Crash when php unload
Since we're putting `ITypeLib *`s into the hash, we're getting `ITypeLib *`s back, not `ITypeLib **`s.
-rw-r--r--NEWS3
-rw-r--r--ext/com_dotnet/com_typeinfo.c4
-rw-r--r--ext/com_dotnet/tests/bug77578.phpt23
3 files changed, 28 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index abf5a572d3..1e953a1176 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,9 @@ PHP NEWS
. Fixed bug #77742 (bcpow() implementation related to gcc compiler
optimization). (Nikita)
+- COM:
+ . Fixed bug #77578 (Crash when php unload). (cmb)
+
- Date:
. Fixed bug #50020 (DateInterval:createDateFromString() silently fails).
(Derick)
diff --git a/ext/com_dotnet/com_typeinfo.c b/ext/com_dotnet/com_typeinfo.c
index 40f21aea6b..1847a565a2 100644
--- a/ext/com_dotnet/com_typeinfo.c
+++ b/ext/com_dotnet/com_typeinfo.c
@@ -225,8 +225,8 @@ PHP_COM_DOTNET_API int php_com_import_typelib(ITypeLib *TL, int mode, int codepa
/* Type-library stuff */
void php_com_typelibrary_dtor(zval *pDest)
{
- ITypeLib **Lib = (ITypeLib**)Z_PTR_P(pDest);
- ITypeLib_Release(*Lib);
+ ITypeLib *Lib = (ITypeLib*)Z_PTR_P(pDest);
+ ITypeLib_Release(Lib);
}
PHP_COM_DOTNET_API ITypeLib *php_com_load_typelib_via_cache(char *search_string,
diff --git a/ext/com_dotnet/tests/bug77578.phpt b/ext/com_dotnet/tests/bug77578.phpt
new file mode 100644
index 0000000000..e68494468e
--- /dev/null
+++ b/ext/com_dotnet/tests/bug77578.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #77578 (Crash when php unload)
+--SKIPIF--
+<?php
+if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
+?>
+--FILE--
+<?php
+// To actually be able to verify the crash during shutdown on Windows, we have
+// to execute a PHP subprocess, and check its exit status.
+$php = PHP_BINARY;
+$ini = php_ini_loaded_file();
+$iniopt = $ini ? "-c $ini" : '';
+$command = "$php $iniopt -d com.autoregister_typelib=1 -r \"new COM('WbemScripting.SWbemLocator');\"";
+exec($command, $output, $status);
+var_dump($output, $status);
+?>
+===DONE===
+--EXPECT--
+array(0) {
+}
+int(0)
+===DONE===