felipe                                   Mon, 14 Dec 2009 21:44:56 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=292143

Log:
- Fixed memory leak when E_STRICT message is getted

Changed paths:
    U   php/php-src/branches/PHP_5_3/ext/pdo/pdo_stmt.c
    A   
php/php-src/branches/PHP_5_3/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt
    U   php/php-src/trunk/ext/pdo/pdo_stmt.c
    A   php/php-src/trunk/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt

Modified: php/php-src/branches/PHP_5_3/ext/pdo/pdo_stmt.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/pdo/pdo_stmt.c	2009-12-14 21:29:08 UTC (rev 292142)
+++ php/php-src/branches/PHP_5_3/ext/pdo/pdo_stmt.c	2009-12-14 21:44:56 UTC (rev 292143)
@@ -795,6 +795,10 @@
 		}
 		return 0;
 	}
+	if (is_callable_error) {
+		/* Possible E_STRICT error message */
+		efree(is_callable_error);
+	}

 	fci->param_count = num_args; /* probably less */
 	fci->params = safe_emalloc(sizeof(zval**), num_args, 0);

Added: php/php-src/branches/PHP_5_3/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt	2009-12-14 21:44:56 UTC (rev 292143)
@@ -0,0 +1,126 @@
+--TEST--
+Testing several callbacks using PDO::FETCH_FUNC
+--FILE--
+<?php
+
+$db = new PDO('sqlite::memory:');
+$db->exec('CREATE TABLE testing (id INTEGER , name VARCHAR)');
+$db->exec('INSERT INTO testing VALUES(1, "php")');
+$db->exec('INSERT INTO testing VALUES(2, "")');
+
+$st = $db->query('SELECT * FROM testing');
+$st->fetchAll(PDO::FETCH_FUNC, function($x, $y) use ($st) { var_dump($st); print "data: $x, $y\n"; });
+
+$st = $db->query('SELECT name FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, 'strtoupper'));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, 'nothing'));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, ''));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, NULL));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, 1));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, array('self', 'foo')));
+
+class foo {
+	public function foo($x) {
+		return "--- $x ---";
+	}
+}
+class bar extends foo {
+	public function __construct($db) {
+		$st = $db->query('SELECT * FROM testing');
+		var_dump($st->fetchAll(PDO::FETCH_FUNC, array($this, 'parent::foo')));
+	}
+
+	static public function test($x, $y) {
+		return $x .'---'. $y;
+	}
+
+	private function test2($x, $y) {
+		return $x;
+	}
+
+	public function test3($x, $y) {
+		return $x .'==='. $y;
+	}
+}
+
+new bar($db);
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, array('bar', 'test')));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, array('bar', 'test2')));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, array('bar', 'test3')));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, array('bar', 'inexistent')));
+
+?>
+--EXPECTF--
+object(PDOStatement)#%d (1) {
+  [%u|b%"queryString"]=>
+  %string|unicode%(21) "SELECT * FROM testing"
+}
+data: 1, php
+object(PDOStatement)#%d (1) {
+  [%u|b%"queryString"]=>
+  %string|unicode%(21) "SELECT * FROM testing"
+}
+data: 2,
+array(2) {
+  [0]=>
+  %string|unicode%(3) "PHP"
+  [1]=>
+  %string|unicode%(0) ""
+}
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: function 'nothing' not found or invalid function name in %s on line %d
+bool(false)
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: function '' not found or invalid function name in %s on line %d
+bool(false)
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: no array or string given in %s on line %d
+bool(false)
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: no array or string given in %s on line %d
+bool(false)
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: cannot access self:: when no class scope is active in %s on line %d
+bool(false)
+array(2) {
+  [0]=>
+  %string|unicode%(9) "--- 1 ---"
+  [1]=>
+  %string|unicode%(9) "--- 2 ---"
+}
+array(2) {
+  [0]=>
+  %string|unicode%(7) "1---php"
+  [1]=>
+  %string|unicode%(4) "2---"
+}
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: cannot access private method bar::test2() in %s on line %d
+bool(false)
+array(2) {
+  [0]=>
+  %string|unicode%(7) "1===php"
+  [1]=>
+  %string|unicode%(4) "2==="
+}
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: class 'bar' does not have a method 'inexistent' in %s on line %d
+bool(false)


Property changes on: php/php-src/branches/PHP_5_3/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/trunk/ext/pdo/pdo_stmt.c
===================================================================
--- php/php-src/trunk/ext/pdo/pdo_stmt.c	2009-12-14 21:29:08 UTC (rev 292142)
+++ php/php-src/trunk/ext/pdo/pdo_stmt.c	2009-12-14 21:44:56 UTC (rev 292143)
@@ -794,6 +794,10 @@
 		}
 		return 0;
 	}
+	if (is_callable_error) {
+		/* Possible E_STRICT error message */
+		efree(is_callable_error);
+	}

 	fci->param_count = num_args; /* probably less */
 	fci->params = safe_emalloc(sizeof(zval**), num_args, 0);

Added: php/php-src/trunk/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt
===================================================================
--- php/php-src/trunk/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt	2009-12-14 21:44:56 UTC (rev 292143)
@@ -0,0 +1,126 @@
+--TEST--
+Testing several callbacks using PDO::FETCH_FUNC
+--FILE--
+<?php
+
+$db = new PDO('sqlite::memory:');
+$db->exec('CREATE TABLE testing (id INTEGER , name VARCHAR)');
+$db->exec('INSERT INTO testing VALUES(1, "php")');
+$db->exec('INSERT INTO testing VALUES(2, "")');
+
+$st = $db->query('SELECT * FROM testing');
+$st->fetchAll(PDO::FETCH_FUNC, function($x, $y) use ($st) { var_dump($st); print "data: $x, $y\n"; });
+
+$st = $db->query('SELECT name FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, 'strtoupper'));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, 'nothing'));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, ''));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, NULL));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, 1));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, array('self', 'foo')));
+
+class foo {
+	public function foo($x) {
+		return "--- $x ---";
+	}
+}
+class bar extends foo {
+	public function __construct($db) {
+		$st = $db->query('SELECT * FROM testing');
+		var_dump($st->fetchAll(PDO::FETCH_FUNC, array($this, 'parent::foo')));
+	}
+
+	static public function test($x, $y) {
+		return $x .'---'. $y;
+	}
+
+	private function test2($x, $y) {
+		return $x;
+	}
+
+	public function test3($x, $y) {
+		return $x .'==='. $y;
+	}
+}
+
+new bar($db);
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, array('bar', 'test')));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, array('bar', 'test2')));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, array('bar', 'test3')));
+
+$st = $db->query('SELECT * FROM testing');
+var_dump($st->fetchAll(PDO::FETCH_FUNC, array('bar', 'inexistent')));
+
+?>
+--EXPECTF--
+object(PDOStatement)#%d (1) {
+  [%u|b%"queryString"]=>
+  %string|unicode%(21) "SELECT * FROM testing"
+}
+data: 1, php
+object(PDOStatement)#%d (1) {
+  [%u|b%"queryString"]=>
+  %string|unicode%(21) "SELECT * FROM testing"
+}
+data: 2,
+array(2) {
+  [0]=>
+  %string|unicode%(3) "PHP"
+  [1]=>
+  %string|unicode%(0) ""
+}
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: function 'nothing' not found or invalid function name in %s on line %d
+bool(false)
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: function '' not found or invalid function name in %s on line %d
+bool(false)
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: no array or string given in %s on line %d
+bool(false)
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: no array or string given in %s on line %d
+bool(false)
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: cannot access self:: when no class scope is active in %s on line %d
+bool(false)
+array(2) {
+  [0]=>
+  %string|unicode%(9) "--- 1 ---"
+  [1]=>
+  %string|unicode%(9) "--- 2 ---"
+}
+array(2) {
+  [0]=>
+  %string|unicode%(7) "1---php"
+  [1]=>
+  %string|unicode%(4) "2---"
+}
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: cannot access private method bar::test2() in %s on line %d
+bool(false)
+array(2) {
+  [0]=>
+  %string|unicode%(7) "1===php"
+  [1]=>
+  %string|unicode%(4) "2==="
+}
+
+Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error: class 'bar' does not have a method 'inexistent' in %s on line %d
+bool(false)


Property changes on: php/php-src/trunk/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to