Hi Alexandra,

I'm not sure in tis patch.
It does the same as double calling to zend_list_delete(Z_LVAL_PP(pv_conn));
Also your fix may cause deletion of connection (le_conn) before deletion of
related results (le_result).
Is it allowed?

Thanks. Dmitry.

> -----Original Message-----
> From: Alexandra S. [mailto:[EMAIL PROTECTED] 
> Sent: Sunday, September 23, 2007 1:59 PM
> To: internals@lists.php.net
> Subject: [PHP-DEV] [Fwd: bug in odbc extension 
> http://bugs.php.net/bug.php?id=37527]
> 
> 
> Hi,
> 
> I am attaching here a patch for this bug.
> Please review it.
> 
> -------- Original Message --------
> Subject:      bug in odbc extension 
> http://bugs.php.net/bug.php?id=37527
> Date:         Tue, 18 Sep 2007 15:29:23 +0200
> From:         Alexandra S. <[EMAIL PROTECTED]>
> To:   internals@lists.php.net
> 
> 
> 
> 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