RE: [PHP-DEV] [Fwd: bug in odbc extension http://bugs.php.net/bug.php?id=37527]
| From: | Dmitry Stogov | Date: | Tue, 25 Sep 2007 07:58:34 +0000 |
| Subject: | RE: [PHP-DEV] [Fwd: bug in odbc extension http://bugs.php.net/bug.php?id=37527] | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-32442@lists.php.net to get a copy of this message | ||
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:alexandra@zend.com]
> 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. <alexandra@zend.com>
> 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
>
>
>
>
>
>
>
>