ID:               35205
 Updated by:       [EMAIL PROTECTED]
 Reported By:      robertg2 at hope dot ac dot uk
-Status:           Feedback
+Status:           Closed
 Bug Type:         OCI8 related
 Operating System: Solaris 8
 PHP Version:      5.0.5
 Assigned To:      tony2001
 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.

Thanks, Chris.
Patch applied (well, partly).

>In php_oci_connection_close() why are there some "free" 
>and some "efree" calls?
free() for persistent handles and efree() for usual ones.
memory allocated by efree() is freed at the end of request by Zend
memory manager.


Previous Comments:
------------------------------------------------------------------------

[2005-11-25 07:50:09] cjbj at hotmail dot com

Antony, I've looked at session cleanup.

Problem 1:

    Incorrect order of OCISessionEnd and OCIServerDetach calls in
    php_oci_connection_close()

    The "Terminating the Application" section in chapter 2 of the OCI
    manual: http://download-west.oracle.com/docs/cd/B19306_01/
    appdev.102/b14250/oci02bas.htm#sthref217 says to call
    OCISessionEnd before calling OCIServerDetach.

Problem 2:

    In php_oci_connection_close(), connection->session is used after
    it has been freed.

Problem 3:

    In php_oci_connection_close() why are there some "free" and some
    "efree" calls?

Problem 4:

    In php_oci_cleanup_global_handles() the error handle should be of
    type OCI_HTYPE_ERROR, not OCI_HTYPE_ENV

Problem 5 (minor suggestion):

    Calls to OCIEnvInit, OCIHandleAlloc, OCIErrorGet & OCIHandleFree
in
    php_oci_init_global_handles() could use PHP_OCI_CALL() so debug
trace
    is generated.

    Call to OCIInitialize in PHP_MINIT_FUNCTION() could use
    PHP_OCI_CALL().

    Call to OCITerminate in PHP_MSHUTDOWN_FUNCTION() could use
    PHP_OCI_CALL().

A suggested patch is below.  Please review and test as I may have
misunderstood the solutions for problems 3 and 5, or not have taken
care of some special cases.

I have been unable to verify the patch solves the problem because I
only see the problem on Windows, but can only build on Linux.


--- oci8.c.1.283        2005-11-25 15:52:57.000000000 +1100
+++ oci8.c      2005-11-25 17:18:41.006806296 +1100
@@ -396,13 +396,13 @@
   sb4 error_code = 0;
   text tmp_buf[PHP_OCI_ERRBUF_LEN];

-  errcode = OCIEnvInit (&OCI_G(env), OCI_DEFAULT, 0, NULL);
+  errcode = PHP_OCI_CALL(OCIEnvInit, (&OCI_G(env), OCI_DEFAULT, 0,
NULL));

   if (errcode == OCI_ERROR) {
     goto oci_error;
   }

-  errcode = OCIHandleAlloc (OCI_G(env), (dvoid **)&OCI_G(err),
OCI_HTYPE_ERROR, 0, NULL);
+  errcode = PHP_OCI_CALL(OCIHandleAlloc, (OCI_G(env), (dvoid
**)&OCI_G(err), OCI_HTYPE_ERROR, 0, NULL));

   if (errcode == OCI_ERROR || errcode == OCI_SUCCESS_WITH_INFO) {
     goto oci_error;
@@ -412,7 +412,7 @@

 oci_error:

-  OCIErrorGet(OCI_G(env), (ub4)1, NULL, &error_code, tmp_buf,
(ub4)PHP_OCI_ERRBUF_LEN, (ub4)OCI_HTYPE_ERROR);
+  PHP_OCI_CALL(OCIErrorGet, (OCI_G(env), (ub4)1, NULL, &error_code,
tmp_buf, (ub4)PHP_OCI_ERRBUF_LEN, (ub4)OCI_HTYPE_ERROR));

   if (error_code) {
     int tmp_buf_len = strlen(tmp_buf);
@@ -424,7 +424,7 @@
     if (errcode != OCI_SUCCESS_WITH_INFO) {
       php_error_docref(NULL TSRMLS_CC, E_WARNING, "OCI_ERROR: %s",
tmp_buf);

-      OCIHandleFree((dvoid *) OCI_G(env), OCI_HTYPE_ENV);
+      PHP_OCI_CALL(OCIHandleFree, ((dvoid *) OCI_G(env),
OCI_HTYPE_ENV));

       OCI_G(env) = NULL;
       OCI_G(err) = NULL;
@@ -441,7 +441,7 @@
 static void php_oci_cleanup_global_handles(TSRMLS_D)
 {
   if (OCI_G(err)) {
-    PHP_OCI_CALL(OCIHandleFree, ((dvoid *) OCI_G(err),
OCI_HTYPE_ENV));
+    PHP_OCI_CALL(OCIHandleFree, ((dvoid *) OCI_G(err),
OCI_HTYPE_ERROR));
     OCI_G(err) = NULL;
   }

@@ -480,7 +480,7 @@
 #endif

 #if !HAVE_OCI_ENV_CREATE
-  OCIInitialize(PHP_OCI_INIT_MODE, NULL, NULL, NULL, NULL);
+  PHP_OCI_CALL(OCIInitialize, (PHP_OCI_INIT_MODE, NULL, NULL, NULL,
NULL));
 #endif

   ZEND_INIT_MODULE_GLOBALS(oci, php_oci_init_globals, NULL);
@@ -609,7 +609,7 @@
 #endif

 #if !HAVE_OCI_ENV_CREATE
-  OCITerminate(OCI_DEFAULT);
+  PHP_OCI_CALL(OCITerminate, (OCI_DEFAULT));
 #endif

   return SUCCESS;
@@ -1408,10 +1408,18 @@
     }
   }

+  if (connection->svc && connection->session && connection->is_open)
{
+    PHP_OCI_CALL(OCISessionEnd, (connection->svc, OCI_G(err),
connection->session, (ub4) 0));
+  }
+
   if (connection->is_attached) {
     PHP_OCI_CALL(OCIServerDetach, (connection->server, OCI_G(err),
OCI_DEFAULT));
   }

+  if (connection->svc) {
+    PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->svc, (ub4)
OCI_HTYPE_SVCCTX));
+  }
+
   if (connection->err) {
     PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->err, (ub4)
OCI_HTYPE_ERROR));
   }
@@ -1424,23 +1432,15 @@
     PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->server, (ub4)
OCI_HTYPE_SERVER));
   }

-  if (connection->svc) {
-    if (connection->session && connection->is_open) {
-      PHP_OCI_CALL(OCISessionEnd, (connection->svc, OCI_G(err),
connection->session, (ub4) 0));
-    }
-
-    PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->svc, (ub4)
OCI_HTYPE_SVCCTX));
-  }
-
   if (connection->env) {
     PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->env,
OCI_HTYPE_ENV));
   }

   if (connection->is_persistent) {
     if (connection->hash_key) {
-      free(connection->hash_key);
+      efree(connection->hash_key);
     }
-    free(connection);
+    efree(connection);
   }
   else {
     if (connection->hash_key) {

------------------------------------------------------------------------

[2005-11-22 12:10:35] [EMAIL PROTECTED]

Since I can't reproduce it even on Solaris, you have to make a research
on your own:
Enable oci_internal_debug(true); and check its output.
Make sure php_oci_connection_close() function is called on every
connection resource.

------------------------------------------------------------------------

[2005-11-22 12:00:39] robertg2 at hope dot ac dot uk

We've tried it on Linux with Instant Client 10 - it works fine.

I shall speak with my superiors about providing an account but it seems
unlikely we will be able to do so.  Is there no other way to progress
this bug report further?

------------------------------------------------------------------------

[2005-11-22 11:48:40] [EMAIL PROTECTED]

Works fine here, both on Linux and Solaris.
Please provide an account on this server or try on a different server
yourself.

------------------------------------------------------------------------

[2005-11-21 02:39:34] robertg2 at hope dot ac dot uk

Okay, for real this time:

Using the 32-bit instantclient 10 doesn't seem to have an effect on the
behaviour in question.

<?
oci_connect('user', 'pw', '//HOST/DBNAME');
?>

After browsing to a script such as this via the web, the connection to
the database remains.

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/35205

-- 
Edit this bug report at http://bugs.php.net/?id=35205&edit=1

Reply via email to