felipe          Fri Feb 13 02:18:57 2009 UTC

  Modified files:              (Branch: PHP_5_3)
    /php-src/ext/pdo    pdo_dbh.c 
  Log:
  MFH:
  - Fixed bug #43831 ($this gets mangled when extending PDO with persistent 
connection)
  - Fixed bug #45432 (PDO: persistent connection leak)
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/pdo/pdo_dbh.c?r1=1.82.2.31.2.17.2.19&r2=1.82.2.31.2.17.2.20&diff_format=u
Index: php-src/ext/pdo/pdo_dbh.c
diff -u php-src/ext/pdo/pdo_dbh.c:1.82.2.31.2.17.2.19 
php-src/ext/pdo/pdo_dbh.c:1.82.2.31.2.17.2.20
--- php-src/ext/pdo/pdo_dbh.c:1.82.2.31.2.17.2.19       Wed Dec 31 11:15:40 2008
+++ php-src/ext/pdo/pdo_dbh.c   Fri Feb 13 02:18:57 2009
@@ -18,7 +18,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: pdo_dbh.c,v 1.82.2.31.2.17.2.19 2008/12/31 11:15:40 sebastian Exp $ */
+/* $Id: pdo_dbh.c,v 1.82.2.31.2.17.2.20 2009/02/13 02:18:57 felipe Exp $ */
 
 /* The PDO Database Handle Class */
 
@@ -328,23 +328,27 @@
                                memcpy((char *)pdbh->persistent_id, hashkey, 
plen+1);
                                pdbh->persistent_id_len = plen+1;
                                pdbh->refcount = 1;
+                               pdbh->properties = NULL;
                        }
                }
 
                if (pdbh) {
                        /* let's copy the emalloc bits over from the other 
handle */
-                       pdbh->ce = dbh->ce;
-                       pdbh->def_stmt_ce = dbh->def_stmt_ce;
-                       pdbh->def_stmt_ctor_args = dbh->def_stmt_ctor_args;
-                       pdbh->properties = dbh->properties;
+                       if (pdbh->properties) {
+                               zend_hash_destroy(dbh->properties);     
+                               efree(dbh->properties);
+                       } else {
+                               pdbh->ce = dbh->ce;
+                               pdbh->def_stmt_ce = dbh->def_stmt_ce;
+                               pdbh->def_stmt_ctor_args = 
dbh->def_stmt_ctor_args;
+                               pdbh->properties = dbh->properties;
+                       }
                        /* kill the non-persistent thingamy */
                        efree(dbh);
                        /* switch over to the persistent one */
                        dbh = pdbh;
                        zend_object_store_set_object(object, dbh TSRMLS_CC);
-                       if (!call_factory) {
-                               dbh->refcount++;
-                       }
+                       dbh->refcount++;
                }
 
                if (hashkey) {
@@ -352,11 +356,13 @@
                }
        }
        
-       dbh->data_source_len = strlen(colon + 1);
-       dbh->data_source = (const char*)pestrdup(colon + 1, is_persistent);
-       dbh->username = username ? pestrdup(username, is_persistent) : NULL;
-       dbh->password = password ? pestrdup(password, is_persistent) : NULL;
-       dbh->default_fetch_type = PDO_FETCH_BOTH;
+       if (call_factory) {
+               dbh->data_source_len = strlen(colon + 1);
+               dbh->data_source = (const char*)pestrdup(colon + 1, 
is_persistent);
+               dbh->username = username ? pestrdup(username, is_persistent) : 
NULL;
+               dbh->password = password ? pestrdup(password, is_persistent) : 
NULL;
+               dbh->default_fetch_type = PDO_FETCH_BOTH;
+       }       
 
        dbh->auto_commit = pdo_attr_lval(options, PDO_ATTR_AUTOCOMMIT, 1 
TSRMLS_CC);
 
@@ -1526,11 +1532,10 @@
                dbh->properties = NULL;
        }
        
-       if (!dbh->is_persistent) {
-               dbh_free(dbh TSRMLS_CC);
-       } else if (dbh->methods && dbh->methods->persistent_shutdown) {
+       if (dbh->is_persistent && dbh->methods && 
dbh->methods->persistent_shutdown) {
                dbh->methods->persistent_shutdown(dbh TSRMLS_CC);
        }
+       dbh_free(dbh TSRMLS_CC);
 }
 
 zend_object_value pdo_dbh_new(zend_class_entry *ce TSRMLS_DC)



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to