]> granicus.if.org Git - php/commitdiff
Fixed bug #63176 (Segmentation fault when instantiate 2 persistent PDO to the same...
authorXinchen Hui <laruence@php.net>
Sun, 16 Jun 2013 14:55:59 +0000 (22:55 +0800)
committerXinchen Hui <laruence@php.net>
Sun, 16 Jun 2013 14:55:59 +0000 (22:55 +0800)
NEWS
ext/pdo/pdo_dbh.c
ext/pdo_mysql/tests/bug63176.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index d9634ffdddf68ed6c9cfcfae5d130c15e402f485..f8d3d78a9f3951262c07aba5a79f6c472d496c93 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,10 @@ PHP                                                                        NEWS
 - FPM:
   . Fixed Bug #64915 (error_log ignored when daemonize=0). (Remi)
 
+- PDO:
+  . Fixed bug #63176 (Segmentation fault when instantiate 2 persistent PDO to 
+    the same db server). (Laruence)
+
 - PDO_DBlib:
   . Fixed bug #63638 (Cannot connect to SQL Server 2008 with PDO dblib). 
     (Stanley Sufficool)
index e6265f58075abc0689fdfa71b42c73ef2b601b3d..25db6842f623538a0f568139d34bdb1afe8a3055 100644 (file)
@@ -338,6 +338,9 @@ static PHP_METHOD(PDO, dbh_constructor)
                        if (pdbh->std.properties) {
                                zend_hash_destroy(dbh->std.properties); 
                                efree(dbh->std.properties);
+                               if (dbh->std.properties_table) {
+                                       efree(dbh->std.properties_table);
+                               }
                        } else {
                                pdbh->std.ce = dbh->std.ce;
                                pdbh->def_stmt_ce = dbh->def_stmt_ce;
@@ -1575,6 +1578,7 @@ static void pdo_dbh_free_storage(pdo_dbh_t *dbh TSRMLS_DC)
        }
        zend_object_std_dtor(&dbh->std TSRMLS_CC);
        dbh->std.properties = NULL;
+       dbh->std.properties_table = NULL;
        dbh_free(dbh TSRMLS_CC);
 }
 
diff --git a/ext/pdo_mysql/tests/bug63176.phpt b/ext/pdo_mysql/tests/bug63176.phpt
new file mode 100644 (file)
index 0000000..392a90b
--- /dev/null
@@ -0,0 +1,54 @@
+--TEST--
+Bug #63176 (Segmentation fault when instantiate 2 persistent PDO to the same db server)
+--SKIPIF--
+<?php
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+MySQLPDOTest::skip();
+?>
+--FILE--
+<?php
+require(dirname(__FILE__). DIRECTORY_SEPARATOR . 'config.inc');
+class PDO2 extends PDO {
+       protected $transLevel;
+}
+
+class PDO3 extends PDO {
+       protected $tomato;
+}
+
+
+class ModelA {
+       public function __construct($h) {
+               var_dump($h);
+               if ($h) {
+                       $this->db = new PDO2(PDO_MYSQL_TEST_DSN, PDO_MYSQL_TEST_USER, PDO_MYSQL_TEST_PASS, array(PDO::ATTR_PERSISTENT => true));
+               } else {
+                       $this->db = new PDO2(PDO_MYSQL_TEST_DSN, PDO_MYSQL_TEST_USER, PDO_MYSQL_TEST_PASS, array(PDO::ATTR_PERSISTENT => true));
+               }
+               $this->db->query('SELECT 1')->fetchAll();
+       }
+}
+
+$a = new ModelA(true);
+$b = new ModelA(false);
+
+var_dump($a);
+var_dump($b);
+--EXPECTF--
+bool(true)
+bool(false)
+object(ModelA)#%d (1) {
+  ["db"]=>
+  object(PDO2)#%d (1) {
+    ["transLevel":protected]=>
+    NULL
+  }
+}
+object(ModelA)#%d (1) {
+  ["db"]=>
+  object(PDO2)#%d (1) {
+    ["transLevel":protected]=>
+    NULL
+  }
+}