From: [EMAIL PROTECTED]
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