com php-src: fix pdo_mysql crash with empty bound s tream param: ext/pdo_mysql/mysql_statement.c ext/ pdo_mysql/tests/bug70862.phpt

From: Date: Thu, 05 Nov 2015 20:32:31 +0000
Subject: com php-src: fix pdo_mysql crash with empty bound s tream param: ext/pdo_mysql/mysql_statement.c ext/ pdo_mysql/tests/bug70862.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-89603@lists.php.net to get a copy of this message
Commit: 7b32b8f4e142dab17d67721f990ec06749db6768 Author: Anatol Belski <ab@php.net> Thu, 5 Nov 2015 21:32:31 +0100 Parents: 1184f0aca5a4fafc893f131f6012dc44cf5846c4 Branches: PHP-7.0 master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=7b32b8f4e142dab17d67721f990ec06749db6768 Log: fix pdo_mysql crash with empty bound stream param rel #70862 Bugs: https://bugs.php.net/70862 Changed paths: M ext/pdo_mysql/mysql_statement.c A ext/pdo_mysql/tests/bug70862.phpt Diff: diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c index f558430..7c6d327 100644 --- a/ext/pdo_mysql/mysql_statement.c +++ b/ext/pdo_mysql/mysql_statement.c @@ -523,10 +523,11 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da parameter = Z_REFVAL(param->parameter); } if (Z_TYPE_P(parameter) == IS_RESOURCE) { - php_stream *stm; + php_stream *stm = NULL; php_stream_from_zval_no_verify(stm, parameter); if (stm) { - ZVAL_STR(parameter, php_stream_copy_to_mem(stm, PHP_STREAM_COPY_ALL, 0)); + zend_string *mem = php_stream_copy_to_mem(stm, PHP_STREAM_COPY_ALL, 0); + ZVAL_STR(parameter, mem ? mem : STR_EMPTY_ALLOC()); } else { pdo_raise_impl_error(stmt->dbh, stmt, "HY105", "Expected a stream resource"); return 0; diff --git a/ext/pdo_mysql/tests/bug70862.phpt b/ext/pdo_mysql/tests/bug70862.phpt new file mode 100644 index 0000000..4a3a618 --- /dev/null +++ b/ext/pdo_mysql/tests/bug70862.phpt @@ -0,0 +1,46 @@ +--TEST-- +MySQL Prepared Statements and BLOBs +--SKIPIF-- +<?php +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); +MySQLPDOTest::skip(); +?> +--FILE-- +<?php + require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); + $db = MySQLPDOTest::factory(); + + $db->exec('DROP TABLE IF EXISTS test'); + $db->exec(sprintf('CREATE TABLE test(id INT, label BLOB)')); + + $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); + $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true); + + class HelloWrapper { + public function stream_open() { return true; } + public function stream_eof() { return true; } + public function stream_read() { return NULL; } + public function stream_stat() { return array(); } + } + stream_wrapper_register("hello", "HelloWrapper"); + + $f = fopen("hello://there", "r"); + + $stmt = $db->prepare('INSERT INTO test(id, label) VALUES (1, :para)'); + $stmt->bindParam(":para", $f, PDO::PARAM_LOB); + $stmt->execute(); + + var_dump($f); + + print "done!"; +?> +--CLEAN-- +<?php +require dirname(__FILE__) . '/mysql_pdo_test.inc'; +$db = MySQLPDOTest::factory(); +$db->exec('DROP TABLE IF EXISTS test'); +?> +--EXPECTF-- +string(0) "" +done!

« previous php.cvs (#89603) next »