]> granicus.if.org Git - php/commitdiff
- Reverted previous fix for bug #46274 and properly fixed it
authorMatteo Beccati <mbeccati@php.net>
Thu, 23 Apr 2009 13:22:12 +0000 (13:22 +0000)
committerMatteo Beccati <mbeccati@php.net>
Thu, 23 Apr 2009 13:22:12 +0000 (13:22 +0000)
- Fixed bug #48060
# Also added tests for pdo_oci as it's the only other driver currently
# using streams: no regression found

ext/pdo/pdo_stmt.c
ext/pdo_oci/tests/bug46274.phpt [new file with mode: 0644]
ext/pdo_oci/tests/bug46274_2.phpt [new file with mode: 0644]
ext/pdo_pgsql/pgsql_statement.c
ext/pdo_pgsql/tests/bug46274_2.phpt

index 59905c7f9a0e85c85b096604eaf9bf1aec63d756..405d656f89e33b3d76e9c6cc9784e4b0ddb62cf2 100755 (executable)
@@ -583,6 +583,7 @@ static inline void fetch_value(pdo_stmt_t *stmt, zval *dest, int colno, int *typ
                        if (value == NULL) {
                                ZVAL_NULL(dest);
                        } else if (value_len == 0) {
+                               /* Warning, empty strings need to be passed as stream */
                                if (stmt->dbh->stringify || new_type == PDO_PARAM_STR) {
                                        char *buf = NULL;
                                        size_t len;
diff --git a/ext/pdo_oci/tests/bug46274.phpt b/ext/pdo_oci/tests/bug46274.phpt
new file mode 100644 (file)
index 0000000..23ee8ee
--- /dev/null
@@ -0,0 +1,71 @@
+--TEST--
+Bug #46274 (pdo_pgsql - Segfault when using PDO::ATTR_STRINGIFY_FETCHES and blob)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) 
+die('skip not loaded');
+require dirname(__FILE__).'/../../pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require 'ext/pdo/tests/pdo_test.inc';
+$db = PDOTest::test_factory('ext/pdo_oci/tests/common.phpt');
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
+
+try {
+       $db->exec("DROP TABLE test_one_blob");
+} catch (Exception $e) {
+}
+
+$db->beginTransaction();
+
+$db->query('CREATE TABLE test_one_blob (id INT NOT NULL, blob1 BLOB)');
+
+$stmt = $db->prepare("INSERT INTO test_one_blob (id, blob1) VALUES (:id, EMPTY_BLOB()) RETURNING blob1 INTO :foo");
+
+$data = 'foo';
+$blob = fopen('php://memory', 'a');
+fwrite($blob, $data);
+rewind($blob);
+
+$id = 1;
+$stmt->bindparam(':id', $id);
+$stmt->bindparam(':foo', $blob, PDO::PARAM_LOB);
+$stmt->execute();
+
+$data = '';
+$blob = fopen('php://memory', 'a');
+fwrite($blob, $data);
+rewind($blob);
+
+$id = 1;
+$stmt->bindparam(':id', $id);
+$stmt->bindparam(':foo', $blob, PDO::PARAM_LOB);
+$stmt->execute();
+
+$res = $db->query("SELECT blob1 from test_one_blob");
+// Resource
+var_dump($res->fetch());
+
+// Empty string
+var_dump($res->fetch());
+
+$db->exec("DROP TABLE test_one_blob");
+
+?>
+--EXPECTF--
+array(2) {
+  ["blob1"]=>
+  string(3) "foo"
+  [0]=>
+  string(3) "foo"
+}
+array(2) {
+  ["blob1"]=>
+  string(0) ""
+  [0]=>
+  string(0) ""
+}
diff --git a/ext/pdo_oci/tests/bug46274_2.phpt b/ext/pdo_oci/tests/bug46274_2.phpt
new file mode 100644 (file)
index 0000000..cbadcef
--- /dev/null
@@ -0,0 +1,77 @@
+--TEST--
+Bug #46274 (pdo_pgsql - Segfault when using PDO::ATTR_STRINGIFY_FETCHES and blob)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) 
+die('skip not loaded');
+require dirname(__FILE__).'/../../pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require 'ext/pdo/tests/pdo_test.inc';
+$db = PDOTest::test_factory('ext/pdo_oci/tests/common.phpt');
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
+
+try {
+       $db->exec("DROP TABLE test_one_blob");
+} catch (Exception $e) {
+}
+
+$db->beginTransaction();
+
+$db->query('CREATE TABLE test_one_blob (id INT NOT NULL, blob1 BLOB)');
+
+$stmt = $db->prepare("INSERT INTO test_one_blob (id, blob1) VALUES (:id, EMPTY_BLOB()) RETURNING blob1 INTO :foo");
+
+$data = 'foo';
+$blob = fopen('php://memory', 'a');
+fwrite($blob, $data);
+rewind($blob);
+
+$id = 1;
+$stmt->bindparam(':id', $id);
+$stmt->bindparam(':foo', $blob, PDO::PARAM_LOB);
+$stmt->execute();
+
+$data = '';
+$blob = fopen('php://memory', 'a');
+fwrite($blob, $data);
+rewind($blob);
+
+$id = 1;
+$stmt->bindparam(':id', $id);
+$stmt->bindparam(':foo', $blob, PDO::PARAM_LOB);
+$stmt->execute();
+
+$res = $db->query("SELECT blob1 from test_one_blob");
+// Resource
+var_dump($row = $res->fetch());
+var_dump(fread($row[0], 1024));
+fclose($row[0]);
+
+// Empty string
+var_dump($row = $res->fetch());
+var_dump(fread($row[0], 1024));
+fclose($row[0]);
+
+$db->exec("DROP TABLE test_one_blob");
+
+?>
+--EXPECTF--
+array(2) {
+  ["blob1"]=>
+  resource(%d) of type (stream)
+  [0]=>
+  resource(%d) of type (stream)
+}
+string(3) "foo"
+array(2) {
+  ["blob1"]=>
+  resource(%d) of type (stream)
+  [0]=>
+  resource(%d) of type (stream)
+}
+string(0) ""
index 6c3f4ad3d54db3c439c0b820d49655674e57eab0..0a90cd69a02001d049b33a94e88f693b556793db 100644 (file)
@@ -619,8 +619,14 @@ static int pgsql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, unsigned
                                        return 0;
                                } else {
                                        *ptr = php_pdo_pgsql_unescape_bytea(*ptr, &tmp_len);
-                                       *len = tmp_len;
-                                       *caller_frees = 1;
+                                       if (!tmp_len) {
+                                               /* Empty string, return as empty stream */
+                                               *ptr = (char *)php_stream_memory_open(TEMP_STREAM_READONLY, "", 0);
+                                               *len = 0;
+                                       } else {
+                                               *len = tmp_len;
+                                               *caller_frees = 1;
+                                       }
                                }
                                break;
                        case PDO_PARAM_NULL:
index 5e355568803d7dcdd1fbfd725684b10a8422e033..eb675afe9e5f26540e05ac390d6c44b46049001a 100644 (file)
@@ -47,11 +47,13 @@ $res = $db->query("SELECT blob1 from test_one_blob");
 var_dump($x = $res->fetch());
 var_dump(fread($x['blob1'], 10));
 
-// Empty string
+// Resource
 var_dump($res->fetch());
+var_dump(fread($x['blob1'], 10));
 
-// Empty string
+// Resource
 var_dump($res->fetch());
+var_dump(fread($x['blob1'], 10));
 
 // NULL
 var_dump($res->fetch());
@@ -69,16 +71,18 @@ array(2) {
 string(3) "foo"
 array(2) {
   ["blob1"]=>
-  string(0) ""
+  resource(%d) of type (stream)
   [0]=>
-  string(0) ""
+  resource(%d) of type (stream)
 }
+string(0) ""
 array(2) {
   ["blob1"]=>
-  string(0) ""
+  resource(%d) of type (stream)
   [0]=>
-  string(0) ""
+  resource(%d) of type (stream)
 }
+string(0) ""
 array(2) {
   ["blob1"]=>
   NULL