Bug #17012: releasing IDispatch interface too many times (putprop issue)
| From: | rybak at gorlice dot net dot pl | Date: | Sun, 05 May 2002 12:38:41 +0000 |
| Subject: | Bug #17012: releasing IDispatch interface too many times (putprop issue) | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-6948@lists.php.net to get a copy of this message | ||
From: rybak@gorlice.net.pl
Operating system: WinNT 2000
PHP version: 4.2.0
PHP Bug Type: COM related
Bug description: releasing IDispatch interface too many times (putprop issue)
hello
I wrote a script to access ADO database:
----------------------------------------------------
$conn = new COM('ADODB.Connection');
$hr = $conn->Open('Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=test.mdb',"", "", 0);
$oCmd = new COM('ADODB.Command');
$oCmd->ActiveConnection = $conn;
$oCmd->CommandText = "INSERT INTO config(storage) VALUES('testowa
wartosc')";
$oCmd->CommandType = 1;
$rs = $oCmd->Execute();
----------------------------------------------------
in line
$oCmd->ActiveConnection = $conn;
there is created a zendval variable (result from assigning IDispatch $conn
to property) but $conn is not AddRef-ed...
When this invisible variable is destroyed it calls Release on IDispatch
from $conn - But this dispatch is already 0-referenced.
I isolated the code in file COM.c in line 1142 (function do_COM_propput):
---------------------------------------------------
if (SUCCEEDED(hr)) {
php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
} else {
--------------------------------------------------
and changed to:
---------------------------------------------------
if (SUCCEEDED(hr)) {
if ( var_result->vt == VT_DISPATCH )
var_result->pdispVal->lpVtbl->AddRef(var_result->pdispVal);
php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
} else {
----------------------------------------------------
Is it a good solution? Or maybe I don't understand something?
Tristan Rybak
--
Edit bug report at http://bugs.php.net/?id=17012&edit=1
--
Fixed in CVS: http://bugs.php.net/fix.php?id=17012&r=fixedcvs
Fixed in release: http://bugs.php.net/fix.php?id=17012&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=17012&r=needtrace
Try newer version: http://bugs.php.net/fix.php?id=17012&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=17012&r=support
Expected behavior: http://bugs.php.net/fix.php?id=17012&r=notwrong
Not enough info: http://bugs.php.net/fix.php?id=17012&r=notenoughinfo
Submitted twice: http://bugs.php.net/fix.php?id=17012&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=17012&r=globals