diff options
-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 |