logo       
Google Custom Search
    AddThis Social Bookmark Button
-->

cvs: ZendEngine2(PHP_5_2) / zend_object_handlers.c /tests bug43450.phpt p: msg#00026

Subject: cvs: ZendEngine2(PHP_5_2) / zend_object_handlers.c /tests bug43450.phpt php-src NEWS
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




<Prev in Thread] Current Thread [Next in Thread>