Skip to content

Commit

Permalink
fix crash in sqlite when executing with bound stream param
Browse files Browse the repository at this point in the history
rel #70862
  • Loading branch information
weltling committed Nov 8, 2015
1 parent 3bdb7cf commit 352117b
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 4 deletions.
9 changes: 5 additions & 4 deletions ext/sqlite3/sqlite3.c
Expand Up @@ -1527,7 +1527,7 @@ PHP_METHOD(sqlite3stmt, execute)
case SQLITE_BLOB:
{
php_stream *stream = NULL;
zend_string *buffer;
zend_string *buffer = NULL;
if (Z_TYPE_P(parameter) == IS_RESOURCE) {
php_stream_from_zval_no_verify(stream, parameter);
if (stream == NULL) {
Expand All @@ -1540,10 +1540,11 @@ PHP_METHOD(sqlite3stmt, execute)
buffer = Z_STR_P(parameter);
}

sqlite3_bind_blob(stmt_obj->stmt, param->param_number, ZSTR_VAL(buffer), ZSTR_LEN(buffer), SQLITE_TRANSIENT);

if (stream) {
if (buffer) {
sqlite3_bind_blob(stmt_obj->stmt, param->param_number, ZSTR_VAL(buffer), ZSTR_LEN(buffer), SQLITE_TRANSIENT);
zend_string_release(buffer);
} else {
sqlite3_bind_null(stmt_obj->stmt, param->param_number);
}
break;
}
Expand Down
39 changes: 39 additions & 0 deletions ext/sqlite3/tests/sqlite3_blob_bind_resource.phpt
@@ -0,0 +1,39 @@
--TEST--
SQLite3::execute() with a resource bound for blob param
--SKIPIF--
<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
--FILE--
<?php

require_once(dirname(__FILE__) . '/new_db.inc');
require_once(dirname(__FILE__) . '/stream_test.inc');

var_dump($db->exec('CREATE TABLE test (id STRING, data BLOB)'));
$insert_stmt = $db->prepare("INSERT INTO test (id, data) VALUES (1, ?)");


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");

var_dump($insert_stmt->bindParam(1, $f, SQLITE3_BLOB));
var_dump($insert_stmt->execute());

var_dump($insert_stmt->close());
fclose($f);

?>
+++DONE+++
--EXPECTF--
bool(true)
bool(true)
object(SQLite3Result)#%d (%d) {
}
bool(true)
+++DONE+++

0 comments on commit 352117b

Please sign in to comment.