|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-02-10 09:14 UTC] tobias dot john at fondsnet dot de
Description:
------------
Memory allocated by a DateTime object is not released correctly. Inifite loops of allocating DateTime objects let the memory consumption even raise above the php memory limit.
Reproduce code:
---------------
while(1) {
$v = new \DateTime();
}
Expected result:
----------------
Infinite loop.
Actual result:
--------------
php(38699) malloc: *** mmap(size=16777216) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Bus error
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Nov 09 18:00:02 2025 UTC |
Same bug found in PHP versions 5.2.8 and 5.2.9 on Linux. ----- Test code: for ( $i = 0; $i < 100; $i++ ) { $d = new DateTime(); unset($d); } ----- valgrind --leak-check=yes php test.php: ==20642== 235 bytes in 1 blocks are possibly lost in loss record 4 of 12 ==20642== at 0x40203C0: malloc (vg_replace_malloc.c:149) ==20642== by 0x80AB486: timelib_tzinfo_clone (in /usr/bin/php) ==20642== by 0x8097FD3: timelib_fill_holes (in /usr/bin/php) ==20642== by 0x8095535: (within /usr/bin/php) ==20642== by 0x8095605: zim_DateTime___construct (in /usr/bin/php) ==20642== by 0x817D834: (within /usr/bin/php) ==20642== by 0x819ED4F: execute (in /usr/bin/php) ==20642== by 0x8166F25: zend_execute_scripts (in /usr/bin/php) ==20642== by 0x813862F: php_execute_script (in /usr/bin/php) ==20642== by 0x81A7178: main (in /usr/bin/php) ==20642== ==20642== ==20642== 2,820 bytes in 3 blocks are possibly lost in loss record 8 of 12 ==20642== at 0x40203C0: malloc (vg_replace_malloc.c:149) ==20642== by 0x80AB47A: timelib_tzinfo_clone (in /usr/bin/php) ==20642== by 0x8097FD3: timelib_fill_holes (in /usr/bin/php) ==20642== by 0x8095535: (within /usr/bin/php) ==20642== by 0x8095605: zim_DateTime___construct (in /usr/bin/php) ==20642== by 0x817D834: (within /usr/bin/php) ==20642== by 0x819ED4F: execute (in /usr/bin/php) ==20642== by 0x8166F25: zend_execute_scripts (in /usr/bin/php) ==20642== by 0x813862F: php_execute_script (in /usr/bin/php) ==20642== by 0x81A7178: main (in /usr/bin/php) ==20642== ==20642== ==20642== 132,845 (4,800 direct, 128,045 indirect) bytes in 100 blocks are definitely lost in loss record 9 of 12 ==20642== at 0x401F6FF: calloc (vg_replace_malloc.c:279) ==20642== by 0x80AB420: timelib_tzinfo_ctor (in /usr/bin/php) ==20642== by 0x80AB446: timelib_tzinfo_clone (in /usr/bin/php) ==20642== by 0x8097FD3: timelib_fill_holes (in /usr/bin/php) ==20642== by 0x8095535: (within /usr/bin/php) ==20642== by 0x8095605: zim_DateTime___construct (in /usr/bin/php) ==20642== by 0x817D834: (within /usr/bin/php) ==20642== by 0x819ED4F: execute (in /usr/bin/php) ==20642== by 0x8166F25: zend_execute_scripts (in /usr/bin/php) ==20642== by 0x813862F: php_execute_script (in /usr/bin/php) ==20642== by 0x81A7178: main (in /usr/bin/php) ----- Setting a default time zone through date_default_timezone_set() or putenv() changes the leak to: ==20819== 7,600 (4,800 direct, 2,800 indirect) bytes in 100 blocks are definitely lost in loss record 10 of 10 ==20819== at 0x401F6FF: calloc (vg_replace_malloc.c:279) ==20819== by 0x80AB420: timelib_tzinfo_ctor (in /usr/bin/php) ==20819== by 0x80AB446: timelib_tzinfo_clone (in /usr/bin/php) ==20819== by 0x8097FD3: timelib_fill_holes (in /usr/bin/php) ==20819== by 0x8095535: (within /usr/bin/php) ==20819== by 0x8095605: zim_DateTime___construct (in /usr/bin/php) ==20819== by 0x817D834: (within /usr/bin/php) ==20819== by 0x819ED4F: execute (in /usr/bin/php) ==20819== by 0x8166F25: zend_execute_scripts (in /usr/bin/php) ==20819== by 0x813862F: php_execute_script (in /usr/bin/php) ==20819== by 0x81A7178: main (in /usr/bin/php)This patch against 5.2.9 seems to be working out for us so far: --- ext/date/php_date.orig.c 2009-03-10 15:02:40.000000000 -0500 +++ ext/date/php_date.c 2009-03-10 15:02:57.000000000 -0500 @@ -1737,7 +1737,7 @@ } timelib_unixtime2local(now, (timelib_sll) time(NULL)); - timelib_fill_holes(dateobj->time, now, 0); + timelib_fill_holes(dateobj->time, now, TIMELIB_NO_CLONE); timelib_update_ts(dateobj->time, tzi); dateobj->time->have_weekday_relative = dateobj->time->have_relative = 0;Updated patch for 5.3.0 final: --- ext/date/php_date.orig.c 2009-06-30 09:46:19.000000000 -0500 +++ ext/date/php_date.c 2009-06-30 10:14:39.000000000 -0500 @@ -2414,7 +2414,7 @@ } timelib_unixtime2local(now, (timelib_sll) time(NULL)); - timelib_fill_holes(dateobj->time, now, 0); + timelib_fill_holes(dateobj->time, now, TIMELIB_NO_CLONE); timelib_update_ts(dateobj->time, tzi); dateobj->time->have_relative = 0;