Hi,

I have been trying to work on this bug. The problem here is in this scenario:

1. odbc connection is established.

2. odbc connection is closed.

3. trying to do a request (example: odbc_exec) to the database using the closed connection -> crash.



As far as I can understand from reading the odbc_exec() function, ZEND_FETCH_RESOURCE2 should return false,, so we do not advance to the SQLAllocStmt call that crashes.

I checked with php 5.2.4 on both Linux and Windows and ZEND_FETCH_RESOURCE2 does not return false.

The reason for it is in the odbc_close function -

for(i = 1; i < nument; i++){

      ptr = zend_list_find(i, &type);

      if(ptr && (type == le_result)){

          res = (odbc_result *)ptr;

          if(res->conn_ptr == conn){

              zend_list_delete(i);

          }

} }

Here only the previous statements of this connection are deleted and not the connection itself.

In the odbc_close_all function all the statements are deleted, and then all the connections.



I suggest to add the deletion of the connection itself to the odbc_close function - so the ZEND_FETCH_RESOURCE2 check will actually work. The situation now is that check do not work and we try all the time to call SQL actions with no existent connections.



Example for possible solution:



for(i = 1; i < nument; i++){

      ptr = zend_list_find(i, &type);

      if(ptr && (type == le_result)){

          res = (odbc_result *)ptr;

          if(res->conn_ptr == conn){

              zend_list_delete(i);

          }

      }

      if(ptr && (type == (is_pconn?le_pconn:le_conn))){

          res = (odbc_result *)ptr;

          if(res == conn){

              zend_list_delete(i);

          }

      }

  }


Alexandra Shpindovsky

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to