Skip to content

Commit 7232779

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Fix #79106: PDO may fetch wrong column indexes with PDO::FETCH_BOTH
2 parents 8ee0494 + ed78c6d commit 7232779

File tree

5 files changed

+85
-30
lines changed

5 files changed

+85
-30
lines changed

ext/pdo/pdo_stmt.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -961,10 +961,9 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value, enum pdo_
961961
case PDO_FETCH_USE_DEFAULT:
962962
case PDO_FETCH_BOTH:
963963
zend_symtable_update(Z_ARRVAL_P(return_value), stmt->columns[i].name, &val);
964-
if (Z_REFCOUNTED(val)) {
965-
Z_ADDREF(val);
964+
if (zend_hash_index_add(Z_ARRVAL_P(return_value), i, &val) != NULL) {
965+
Z_TRY_ADDREF(val);
966966
}
967-
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &val);
968967
break;
969968

970969
case PDO_FETCH_NAMED:

ext/pdo/tests/bug_79106.phpt

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
--TEST--
2+
Bug #79106 (PDO may fetch wrong column indexes with PDO::FETCH_BOTH)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('pdo')) die('skip pdo extension not available');
6+
$dir = getenv('REDIR_TEST_DIR');
7+
if (!$dir) die('skip no driver');
8+
require_once $dir . 'pdo_test.inc';
9+
try {
10+
$db = PDOTest::factory();
11+
} catch (PDOException $e) {
12+
die('skip ' . $e->getMessage());
13+
}
14+
if ($db->query('SELECT 1 as "1"') === false) {
15+
die('skip driver does not support quoted numeric identifiers');
16+
}
17+
?>
18+
--FILE--
19+
<?php
20+
if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR=' . dirname(__FILE__) . '/../../pdo/tests/');
21+
require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
22+
$db = PDOTest::factory();
23+
24+
$stmt = $db->query('SELECT 0 as "2007", 0 as "2008", 0 as "2020"');
25+
var_dump($stmt->fetchAll());
26+
?>
27+
--EXPECT--
28+
array(1) {
29+
[0]=>
30+
array(6) {
31+
[2007]=>
32+
string(1) "0"
33+
[0]=>
34+
string(1) "0"
35+
[2008]=>
36+
string(1) "0"
37+
[1]=>
38+
string(1) "0"
39+
[2020]=>
40+
string(1) "0"
41+
[2]=>
42+
string(1) "0"
43+
}
44+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
--TEST--
2+
Bug #79106 (PDO may fetch wrong column indexes with PDO::FETCH_BOTH) - collision
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('pdo')) die('skip pdo extension not available');
6+
$dir = getenv('REDIR_TEST_DIR');
7+
if (!$dir) die('skip no driver');
8+
require_once $dir . 'pdo_test.inc';
9+
try {
10+
$db = PDOTest::factory();
11+
} catch (PDOException $e) {
12+
die('skip ' . $e->getMessage());
13+
}
14+
if ($db->query('SELECT 1 as "1"') === false) {
15+
die('skip driver does not support quoted numeric identifiers');
16+
}
17+
?>
18+
--FILE--
19+
<?php
20+
if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR=' . dirname(__FILE__) . '/../../pdo/tests/');
21+
require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
22+
$db = PDOTest::factory();
23+
24+
$stmt = $db->query('SELECT 11111 as "1", 22222 as "2"');
25+
var_dump($stmt->fetchAll());
26+
?>
27+
--EXPECT--
28+
array(1) {
29+
[0]=>
30+
array(3) {
31+
[1]=>
32+
string(5) "11111"
33+
[0]=>
34+
string(5) "11111"
35+
[2]=>
36+
string(5) "22222"
37+
}
38+
}

ext/pdo_mysql/tests/bug_61411.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ print "done!";
4747
array(2) {
4848
[1]=>
4949
int(1)
50-
[2]=>
50+
[0]=>
5151
int(1)
5252
}
5353
done!

ext/pdo_mysql/tests/pdo_mysql_fetch_both.phpt

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -59,30 +59,4 @@ $db = MySQLPDOTest::factory();
5959
print "done!";
6060
?>
6161
--EXPECT--
62-
[002] Suspicious FETCH_BOTH result, dumping
63-
array(2) {
64-
[0]=>
65-
string(1) "1"
66-
[1]=>
67-
string(1) "1"
68-
}
69-
array(2) {
70-
[1]=>
71-
string(1) "1"
72-
[2]=>
73-
string(1) "1"
74-
}
75-
[002] Expected differes from returned data, dumping
76-
array(2) {
77-
[0]=>
78-
string(1) "1"
79-
[1]=>
80-
string(1) "1"
81-
}
82-
array(2) {
83-
[1]=>
84-
string(1) "1"
85-
[2]=>
86-
string(1) "1"
87-
}
8862
done!

0 commit comments

Comments
 (0)