]> granicus.if.org Git - php/commitdiff
Fixed bug #51670 getColumnMeta causes segfault when re-executing query after calling...
authorPierrick Charron <pierrick@php.net>
Tue, 27 Apr 2010 05:56:56 +0000 (05:56 +0000)
committerPierrick Charron <pierrick@php.net>
Tue, 27 Apr 2010 05:56:56 +0000 (05:56 +0000)
NEWS
ext/pdo/pdo_stmt.c
ext/pdo_mysql/tests/bug_51670.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index f098b56fce97f6c9d7a9cb9bca89e8462e61fb8a..443094fc5d20dcb6467b7d905779aeb99afe11c0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,8 @@ PHP                                                                        NEWS
 - Fixed handling of session variable serialization on certain prefix
   characters. Reported by Stefan Esser (Ilia)
 
+- Fixed bug #51670 (getColumnMeta causes segfault when re-executing query
+  after calling nextRowset). (Pierrick)
 - Fixed bug #51629 (CURLOPT_FOLLOWLOCATION error message is misleading).
   (Pierre)
 - Fixed bug #51617 (PDO PGSQL still broken against PostGreSQL < 7.4).
index f3ca75ad5fbd2831b8b8ef9297cfc24596e4108e..ccacdbfc18f62b1535734f32820f99311a89648e 100755 (executable)
@@ -2089,6 +2089,8 @@ static int pdo_stmt_do_next_rowset(pdo_stmt_t *stmt TSRMLS_DC)
        }
 
        if (!stmt->methods->next_rowset(stmt TSRMLS_CC)) {
+               /* Set the executed flag to 0 to reallocate columns on next execute */
+               stmt->executed = 0;
                return 0;
        }
 
diff --git a/ext/pdo_mysql/tests/bug_51670.phpt b/ext/pdo_mysql/tests/bug_51670.phpt
new file mode 100644 (file)
index 0000000..d5387e6
--- /dev/null
@@ -0,0 +1,24 @@
+--TEST--
+Bug #51670 (getColumnMeta causes segfault when re-executing query after calling nextRowset)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) die('skip not loaded');
+require dirname(__FILE__) . '/config.inc';
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+$db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
+$query = $db->prepare('SELECT 1 AS num');
+$query->execute();
+if(!is_array($query->getColumnMeta(0))) die('FAIL!');
+$query->nextRowset();
+$query->execute();
+if(!is_array($query->getColumnMeta(0))) die('FAIL!');
+echo 'done!';
+?>
+--EXPECTF--
+done!
+