diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2020-08-26 14:55:34 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2020-08-26 14:55:34 +0200 |
commit | fc4a6cda4bbe7cae32fd6fa5cefe8155122a2dba (patch) | |
tree | 9017e97ee10d20a16db75b95817edb089f655b40 | |
parent | 1b2ec73c1d9175769c3ad4dd40825546851287bc (diff) | |
parent | 1ff981d7a6b258322e9cea17e8c5418d73ef946c (diff) | |
download | php-git-fc4a6cda4bbe7cae32fd6fa5cefe8155122a2dba.tar.gz |
Merge branch 'PHP-7.4' into master
* PHP-7.4:
Fix #64130: COM obj parameters passed by reference are not updated
-rw-r--r-- | ext/com_dotnet/com_com.c | 4 | ||||
-rw-r--r-- | ext/com_dotnet/tests/bug64130.phpt | 27 |
2 files changed, 30 insertions, 1 deletions
diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c index d4e959cfab..f1e8399350 100644 --- a/ext/com_dotnet/com_com.c +++ b/ext/com_dotnet/com_com.c @@ -436,8 +436,9 @@ HRESULT php_com_get_id_of_name(php_com_dotnet_object *obj, char *name, if (obj->typeinfo) { hr = ITypeInfo_GetIDsOfNames(obj->typeinfo, &olename, 1, dispid); if (FAILED(hr)) { + HRESULT hr1 = hr; hr = IDispatch_GetIDsOfNames(V_DISPATCH(&obj->v), &IID_NULL, &olename, 1, LOCALE_SYSTEM_DEFAULT, dispid); - if (SUCCEEDED(hr)) { + if (SUCCEEDED(hr) && hr1 != E_NOTIMPL) { /* fall back on IDispatch direct */ ITypeInfo_Release(obj->typeinfo); obj->typeinfo = NULL; @@ -584,6 +585,7 @@ int php_com_do_invoke_byref(php_com_dotnet_object *obj, zend_internal_function * } } efree(vargs); + if (byref_vals) efree(byref_vals); } return SUCCEEDED(hr) ? SUCCESS : FAILURE; diff --git a/ext/com_dotnet/tests/bug64130.phpt b/ext/com_dotnet/tests/bug64130.phpt new file mode 100644 index 0000000000..0f8e083295 --- /dev/null +++ b/ext/com_dotnet/tests/bug64130.phpt @@ -0,0 +1,27 @@ +--TEST-- +Bug #64130 (COM obj parameters passed by reference are not updated) +--SKIPIF-- +<?php +if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available'); +if (PHP_INT_SIZE != 4) die('skip for 32bit platforms only'); +try { + $ie = new com('InternetExplorer.Application'); +} catch (com_exception $ex) { + die("skip {$ex->getMessage()}"); +} +$ie->quit(); +?> +--FILE-- +<?php +$ie = new com('InternetExplorer.Application'); +$x = 0; +$y = 0; +try { + $ie->clientToWindow($x, $y); +} catch (com_exception $ex) {} +var_dump($x > 0, $y > 0); +$ie->quit(); +?> +--EXPECT-- +bool(true) +bool(true) |