johannes Fri Dec 21 20:58:12 2007 UTC
Added files: (Branch: PHP_5_2)
/ZendEngine2/tests bug43450.phpt
Modified files:
/php-src NEWS
/ZendEngine2 zend_object_handlers.c
Log:
- MFH: Fix #43450 (Memory leak on some functions with implicit object
__toString() call) (Davic C.)
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.1037&r2=1.2027.2.547.2.1038&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.1037 php-src/NEWS:1.2027.2.547.2.1038
--- php-src/NEWS:1.2027.2.547.2.1037 Thu Dec 20 00:31:49 2007
+++ php-src/NEWS Fri Dec 21 20:58:11 2007
@@ -23,6 +23,8 @@
(Ilia)
- Fixed bug #43457 (Prepared statement with incorrect parms doesn't throw
exception with pdo_pgsql driver). (Ilia)
+- Fixed bug #43450 (Memory leak on some functions with implicit object
+ __toString() call). (Davic C.)
- Fixed bug #43386 (array_globals not reset to 0 properly on init). (Ilia)
- Fixed bug #43377 (PHP crashes with invalid argument for DateTimeZone). (Ilia)
- Fixed bug #43373 (pcntl_fork() should not raise E_ERROR on error). (Ilia)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_object_handlers.c?r1=1.135.2.6.2.24&r2=1.135.2.6.2.25&diff_format=u
Index: ZendEngine2/zend_object_handlers.c
diff -u ZendEngine2/zend_object_handlers.c:1.135.2.6.2.24
ZendEngine2/zend_object_handlers.c:1.135.2.6.2.25
--- ZendEngine2/zend_object_handlers.c:1.135.2.6.2.24 Sat Nov 17 21:52:06 2007
+++ ZendEngine2/zend_object_handlers.c Fri Dec 21 20:58:11 2007
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_object_handlers.c,v 1.135.2.6.2.24 2007/11/17 21:52:06 pollita
Exp $ */
+/* $Id: zend_object_handlers.c,v 1.135.2.6.2.25 2007/12/21 20:58:11 johannes
Exp $ */
#include "zend.h"
#include "zend_globals.h"
@@ -1105,6 +1105,9 @@
}
if (Z_TYPE_P(retval) == IS_STRING) {
INIT_PZVAL(writeobj);
+ if (readobj == writeobj) {
+ zval_dtor(readobj);
+ }
ZVAL_ZVAL(writeobj, retval, 1, 1);
if (Z_TYPE_P(writeobj) != type) {
convert_to_explicit_type(writeobj, type);
@@ -1113,6 +1116,9 @@
} else {
zval_ptr_dtor(&retval);
INIT_PZVAL(writeobj);
+ if (readobj == writeobj) {
+ zval_dtor(readobj);
+ }
ZVAL_EMPTY_STRING(writeobj);
zend_error(E_RECOVERABLE_ERROR, "Method
%s::__toString() must return a string value", ce->name);
return SUCCESS;
@@ -1127,15 +1133,23 @@
ce = Z_OBJCE_P(readobj);
zend_error(E_NOTICE, "Object of class %s could not be
converted to int", ce->name);
INIT_PZVAL(writeobj);
+ if (readobj == writeobj) {
+ zval_dtor(readobj);
+ }
ZVAL_LONG(writeobj, 1);
return SUCCESS;
case IS_DOUBLE:
ce = Z_OBJCE_P(readobj);
zend_error(E_NOTICE, "Object of class %s could not be
converted to double", ce->name);
INIT_PZVAL(writeobj);
+ if (readobj == writeobj) {
+ zval_dtor(readobj);
+ }
ZVAL_DOUBLE(writeobj, 1);
return SUCCESS;
default:
+ INIT_PZVAL(writeobj);
+ Z_TYPE_P(writeobj) = IS_NULL;
break;
}
return FAILURE;
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug43450.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug43450.phpt
+++ ZendEngine2/tests/bug43450.phpt
--TEST--
Bug #43450 (Memory leak on some functions with implicit object __toString()
call)
--SKIPIF--
<?php if (!function_exists('memory_get_usage')) die('memory_get_usage() not
installed'); ?>
--FILE--
<?php
error_reporting(E_ALL|E_STRICT);
class Foo
{
public function __toString()
{
return __CLASS__;
}
}
$num_repeats = 100000;
$start = (memory_get_usage() / 1024) + 16;
for ($i=1;$i<$num_repeats;$i++)
{
$foo = new Foo();
md5($foo);
}
$end = memory_get_peak_usage() / 1024;
if ($start < $end) {
echo 'FAIL';
} else {
echo 'PASS';
}
?>
--EXPECT--
PASS
--
Zend Engine CVS Mailing List (http://cvs.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
|