ID:               35205
 Comment by:       cjbj at hotmail dot com
 Reported By:      robertg2 at hope dot ac dot uk
 Status:           Feedback
 Bug Type:         OCI8 related
 Operating System: Solaris 8
 PHP Version:      5.0.5
 Assigned To:      tony2001
 New Comment:

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) {


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

[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.

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

[2005-11-20 13:18:40] robertg2 at hope dot ac dot uk

oh and... as for the comment I made at 1:55am... that was a mistake.  I
hadn't taken the oci_close statement out of the code.

Sorry :(

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

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