summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2015-10-18 11:28:57 +0200
committerAnatol Belski <ab@php.net>2015-10-18 11:28:57 +0200
commitaf8937c0568fc33682c880ff42ba1c845be1b356 (patch)
treea1597f5e2c07ae34e33d4cb5a34f30eb169e52a4
parentc100a742dceaa0bb8dac5251b676155f4c1a8cd3 (diff)
parent7f33ab834d87452082526205c256a4827fb71142 (diff)
downloadphp-git-af8937c0568fc33682c880ff42ba1c845be1b356.tar.gz
Merge branch 'PHP-5.6' into PHP-7.0
* PHP-5.6: C89 compat use spprintf instead (no need to estrdup afterwards). dblib's dbcolname can return null in some cases testcase fot bug #69757 Segmentation fault on pdo_dblib::nextRowset (bug #69757) Conflicts: ext/pdo_dblib/dblib_stmt.c
-rw-r--r--ext/pdo_dblib/dblib_stmt.c18
-rw-r--r--ext/pdo_dblib/tests/bug_69757.phpt32
2 files changed, 46 insertions, 4 deletions
diff --git a/ext/pdo_dblib/dblib_stmt.c b/ext/pdo_dblib/dblib_stmt.c
index 97776548b2..bc709aae7d 100644
--- a/ext/pdo_dblib/dblib_stmt.c
+++ b/ext/pdo_dblib/dblib_stmt.c
@@ -192,15 +192,25 @@ static int pdo_dblib_stmt_describe(pdo_stmt_t *stmt, int colno)
pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
pdo_dblib_db_handle *H = S->H;
struct pdo_column_data *col;
- zend_string *str;
-
+ char *fname;
+
if(colno >= stmt->column_count || colno < 0) {
return FAILURE;
}
col = &stmt->columns[colno];
- str = dbcolname(H->link, colno+1);
- col->name = zend_string_init(str, strlen(str), 0);
+ fname = (char*)dbcolname(H->link, colno+1);
+
+ if (fname && *fname) {
+ col->name = zend_string_init(fname, strlen(fname), 0);
+ } else {
+ char buf[16];
+ int len;
+
+ len = snprintf(buf, sizeof(buf), "computed%d", colno);
+ col->name = zend_string_init(buf, len, 0);
+ }
+
col->maxlen = dbcollen(H->link, colno+1);
col->param_type = PDO_PARAM_STR;
diff --git a/ext/pdo_dblib/tests/bug_69757.phpt b/ext/pdo_dblib/tests/bug_69757.phpt
new file mode 100644
index 0000000000..6c4aee0b6d
--- /dev/null
+++ b/ext/pdo_dblib/tests/bug_69757.phpt
@@ -0,0 +1,32 @@
+--TEST--
+PDO_DBLIB: Segmentation fault on pdo_dblib::nextRowset
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo_dblib')) die('skip not loaded');
+require __DIR__ . '/config.inc';
+?>
+--FILE--
+<?php
+require __DIR__ . '/config.inc';
+
+$sql = "
+ exec dbo.sp_executesql N'
+ SELECT * FROM sysobjects
+ SELECT * FROM syscolumns
+ '
+";
+$stmt = $db->query($sql);
+$resultset1 = $stmt->fetchAll(PDO::FETCH_ASSOC);
+if (true !== $stmt->nextRowset()) {
+ die('expect TRUE on nextRowset');
+}
+$resultset2 = $stmt->fetchAll(PDO::FETCH_ASSOC);
+if (false !== $stmt->nextRowset()) {
+ die('expect FALSE on nextRowset');
+}
+$stmt->closeCursor();
+
+echo "OK\n";
+?>
+--EXPECT--
+OK