ID: 44008 Updated by: [EMAIL PROTECTED] Reported By: christopher dot jones at oracle dot com -Status: Open +Status: Closed Bug Type: OCI8 related Operating System: n/a PHP Version: 5.3CVS-2008-01-31 (snap) Assigned To: sixd New Comment:
This bug has been fixed in CVS. Snapshots of the sources are packaged every three hours; this change will be in the next snapshot. You can grab the snapshot at http://snaps.php.net/. Thank you for the report, and for helping us make PHP better. +------------------------------ | A different fix has been merged to 5.2.6, 5.3 and 6. | Thanks go to Haneef. +------------------------------ Previous Comments: ------------------------------------------------------------------------ [2008-01-31 21:42:24] christopher dot jones at oracle dot com Description: ------------ Incorrect use of OCI-Lob->close() can cause a crash. The crash is ultimately due to Oracle bug 6786812 and is related to thread handling. It reproduces with PHP 5.3 (after DRCP support was added). It is likely to reproduce in threaded builds of PHP 5.x on Windows. There is a code workaround below, but because this might add to the roundtrip count in the general case, I'd like to investigate other solutions. --- oci8_lob.c 24 Jan 2008 14:09:36 -0000 1.7.2.6.2.14.2.3 +++ oci8_lob.c 31 Jan 2008 21:27:10 -0000 @@ -570,13 +570,17 @@ int php_oci_lob_close (php_oci_descriptor *descriptor TSRMLS_DC) { php_oci_connection *connection = descriptor->connection; - - PHP_OCI_CALL_RETURN(connection->errcode, OCILobClose, (connection->svc, connection->err, descriptor->descriptor)); + boolean flag = 0; - if (connection->errcode != OCI_SUCCESS) { - php_oci_error(connection->err, connection->errcode TSRMLS_CC); - PHP_OCI_HANDLE_ERROR(connection, connection->errcode); - return 1; + PHP_OCI_CALL_RETURN(connection->errcode, OCILobIsOpen, (connection->svc, connection->err, descriptor->descriptor, &flag)); + if (connection->errcode == OCI_SUCCESS && flag) { + PHP_OCI_CALL_RETURN(connection->errcode, OCILobClose, (connection->svc, connection->err, descriptor->descriptor)); + + if (connection->errcode != OCI_SUCCESS) { + php_oci_error(connection->err, connection->errcode TSRMLS_CC); + PHP_OCI_HANDLE_ERROR(connection, connection->errcode); + return 1; + } } Reproduce code: --------------- <?php $c = oci_connect('hr', 'hrpwd', '//ca-tools1/XE'); $stmtarray = array( "create or replace procedure ctest (p in out clob) as begin p := 'A'; end;" ); foreach ($stmtarray as $stmt) { $s = oci_parse($c, $stmt); @oci_execute($s); } $stmt = oci_parse($c,'begin ctest(:c_data); end;'); $textLob = oci_new_descriptor($c, OCI_D_LOB); oci_bind_by_name($stmt, ":c_data", $textLob, -1, OCI_B_CLOB); oci_execute($stmt, OCI_DEFAULT); $r = $textLob->load(); echo $r; // Incorrectly closing the lob causes a crash. OCI-LOB->close() is // documented for use only with OCI-Lob->writeTemporary() $textLob->close(); print "ok\n"; ?> ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=44008&edit=1