From: Antony Dovgal Date: Sun, 30 Jul 2006 11:20:41 +0000 (+0000) Subject: MFB: bug #38253 (PDO produces segfault with default fetch mode) X-Git-Tag: RELEASE_1_0_0RC1~2169 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=34cfab8e7c832bb9a5b088428a76cfddca128e53;p=php MFB: bug #38253 (PDO produces segfault with default fetch mode) add test --- diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 3f45e4762e..edd48e4b27 100755 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -842,6 +842,10 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value, zval_dtor(&val); } ce = stmt->fetch.cls.ce; + if (!ce) { + pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "No fetch class specified" TSRMLS_CC); + return 0; + } if ((flags & PDO_FETCH_SERIALIZE) == 0) { object_init_ex(return_value, ce); if (!stmt->fetch.cls.fci.size) { @@ -883,6 +887,10 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value, break; case PDO_FETCH_FUNC: + if (!stmt->fetch.func.function) { + pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "No fetch function specified" TSRMLS_CC); + return 0; + } if (!stmt->fetch.func.fci.size) { if (!do_fetch_func_prepare(stmt TSRMLS_CC)) { diff --git a/ext/pdo/tests/bug_38253.phpt b/ext/pdo/tests/bug_38253.phpt new file mode 100644 index 0000000000..713eefb701 --- /dev/null +++ b/ext/pdo/tests/bug_38253.phpt @@ -0,0 +1,47 @@ +--TEST-- +PDO Common: PHP Bug #38253: PDO produces segfault with default fetch mode +--SKIPIF-- + +--FILE-- +exec ("create table test (id integer primary key, n text)"); +$pdo->exec ("INSERT INTO test (n) VALUES ('hi')"); + +$pdo->setAttribute (PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_CLASS); +$stmt = $pdo->prepare ("SELECT * FROM test"); +$stmt->execute(); +var_dump($stmt->fetchAll()); + +$pdo = PDOTest::factory(); + +$pdo->exec ("create table test2 (id integer primary key, n text)"); +$pdo->exec ("INSERT INTO test2 (n) VALUES ('hi')"); + +$pdo->setAttribute (PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_FUNC); +$stmt = $pdo->prepare ("SELECT * FROM test2"); +$stmt->execute(); +var_dump($stmt->fetchAll()); + +?> +--EXPECTF-- +Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: No fetch class specified in %s on line %d + +Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error%s on line %d +array(0) { +} + +Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: No fetch function specified in %s on line %d + +Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error%s on line %d +array(0) { +}