diff options
author | Anatol Belski <ab@php.net> | 2015-10-18 11:28:57 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2015-10-18 11:28:57 +0200 |
commit | af8937c0568fc33682c880ff42ba1c845be1b356 (patch) | |
tree | a1597f5e2c07ae34e33d4cb5a34f30eb169e52a4 | |
parent | c100a742dceaa0bb8dac5251b676155f4c1a8cd3 (diff) | |
parent | 7f33ab834d87452082526205c256a4827fb71142 (diff) | |
download | php-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.c | 18 | ||||
-rw-r--r-- | ext/pdo_dblib/tests/bug_69757.phpt | 32 |
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 |