I just stumbled upon on this test as it timed out for me(my test vm started swapping, so run-tests.php terminated after 60 sec). I think it would be good if we could somehow check the available ram, and skipif if it isn't enough, and I think we could also save off an str_repeat call: each str_repeat call allocates 512M of ram, so the 5th call will never happen when the bug is present, as it would allocate a little more than 2.5G ram. the test could be modified having a memory limit of 2100M and removing the sixth str_repeat call and the line '5' from the expect output.
btw: what do you think about adding a memory_get_available() function: http://stackoverflow.com/questions/2513505/how-to-get-available-memory-c-g/2513561#2513561 On Tue, Sep 13, 2011 at 8:17 PM, Christopher Jones <christopher.jo...@oracle.com> wrote: > > Dmitry, > > This is diffing for me in 5.4 (I've haven't looked at 5.3 or trunk): > > 007+ Fatal error: Allowed memory size of 3221225472 bytes exhausted at > /home/cjones/phpsrc/php/php-src/branches/PHP_5_4/ext/standard/string.c:4636 > (tried to allocate 536870913 bytes) in > /home/cjones/phpsrc/php/php-src/branches/PHP_5_4/Zend/tests/bug55509.php on > line 12 > 007- Fatal error: Allowed memory size of %d bytes exhausted (tried to > allocate %d bytes) in %s/bug55509.php on line %d > > Chris > > On 09/13/2011 12:01 AM, Dmitry Stogov wrote: >> >> dmitry Tue, 13 Sep 2011 07:01:46 +0000 >> >> Revision: http://svn.php.net/viewvc?view=revision&revision=316590 >> >> Log: >> Fixed bug #55509 (segfault on x86_64 using more than 2G memory). >> (Laruence) >> >> Bug: https://bugs.php.net/55509 (Verified) segfault on x86_64 using more >> than 2G memory >> >> Changed paths: >> U php/php-src/branches/PHP_5_3/NEWS >> A php/php-src/branches/PHP_5_3/Zend/tests/bug55509.phpt >> U php/php-src/branches/PHP_5_3/Zend/zend_alloc.c >> A php/php-src/branches/PHP_5_4/Zend/tests/bug55509.phpt >> U php/php-src/branches/PHP_5_4/Zend/zend_alloc.c >> A php/php-src/trunk/Zend/tests/bug55509.phpt >> U php/php-src/trunk/Zend/zend_alloc.c >> >> Modified: php/php-src/branches/PHP_5_3/NEWS >> =================================================================== >> --- php/php-src/branches/PHP_5_3/NEWS 2011-09-13 06:22:25 UTC (rev >> 316589) >> +++ php/php-src/branches/PHP_5_3/NEWS 2011-09-13 07:01:46 UTC (rev >> 316590) >> @@ -8,6 +8,7 @@ >> . Fixed bug #55366: keys lost when using substr_replace an array. >> (Arpad) >> . Fixed bug #55510: $_FILES 'name' missing first character after >> upload. >> (Arpad) >> + . Fixed bug #55509 (segfault on x86_64 using more than 2G memory). >> (Laruence) >> . Fixed bug #55576: Cannot conditionally move uploaded file without >> race >> condition. (Gustavo) >> . Fixed bug #55504 (Content-Type header is not parsed correctly on >> >> Added: php/php-src/branches/PHP_5_3/Zend/tests/bug55509.phpt >> =================================================================== >> --- php/php-src/branches/PHP_5_3/Zend/tests/bug55509.phpt >> (rev 0) >> +++ php/php-src/branches/PHP_5_3/Zend/tests/bug55509.phpt 2011-09-13 >> 07:01:46 UTC (rev 316590) >> @@ -0,0 +1,33 @@ >> +--TEST-- >> +Bug #55509 (segfault on x86_64 using more than 2G memory) >> +--SKIPIF-- >> +<?php >> +if (PHP_INT_SIZE == 4) { >> + die('skip Not for 32-bits OS'); >> +} >> +?> >> +--INI-- >> +memory_limit=3G >> +--FILE-- >> +<?php >> +$a1 = str_repeat("1", 1024 * 1024 * 1024 * 0.5); >> +echo "1\n"; >> +$a2 = str_repeat("2", 1024 * 1024 * 1024 * 0.5); >> +echo "2\n"; >> +$a3 = str_repeat("3", 1024 * 1024 * 1024 * 0.5); >> +echo "3\n"; >> +$a4 = str_repeat("4", 1024 * 1024 * 1024 * 0.5); >> +echo "4\n"; >> +$a5 = str_repeat("5", 1024 * 1024 * 1024 * 0.5); >> +echo "5\n"; >> +$a6 = str_repeat("6", 1024 * 1024 * 1024 * 0.5); >> +echo "6\n"; >> +?> >> +--EXPECTF-- >> +1 >> +2 >> +3 >> +4 >> +5 >> + >> +Fatal error: Allowed memory size of %d bytes exhausted (tried to allocate >> %d bytes) in %s/bug55509.php on line %d >> >> Modified: php/php-src/branches/PHP_5_3/Zend/zend_alloc.c >> =================================================================== >> --- php/php-src/branches/PHP_5_3/Zend/zend_alloc.c 2011-09-13 >> 06:22:25 UTC (rev 316589) >> +++ php/php-src/branches/PHP_5_3/Zend/zend_alloc.c 2011-09-13 >> 07:01:46 UTC (rev 316590) >> @@ -510,7 +510,7 @@ >> #define ZEND_MM_IS_GUARD_BLOCK(b) (((b)->info._size& >> ZEND_MM_TYPE_MASK) == ZEND_MM_GUARD_BLOCK) >> >> #define ZEND_MM_NEXT_BLOCK(b) ZEND_MM_BLOCK_AT(b, >> ZEND_MM_BLOCK_SIZE(b)) >> -#define ZEND_MM_PREV_BLOCK(b) ZEND_MM_BLOCK_AT(b, >> -(int)((b)->info._prev& ~ZEND_MM_TYPE_MASK)) >> +#define ZEND_MM_PREV_BLOCK(b) ZEND_MM_BLOCK_AT(b, >> -(ssize_t)((b)->info._prev& ~ZEND_MM_TYPE_MASK)) >> >> #define ZEND_MM_PREV_BLOCK_IS_FREE(b) (!((b)->info._prev& >> ZEND_MM_USED_BLOCK)) >> >> >> Added: php/php-src/branches/PHP_5_4/Zend/tests/bug55509.phpt >> =================================================================== >> --- php/php-src/branches/PHP_5_4/Zend/tests/bug55509.phpt >> (rev 0) >> +++ php/php-src/branches/PHP_5_4/Zend/tests/bug55509.phpt 2011-09-13 >> 07:01:46 UTC (rev 316590) >> @@ -0,0 +1,33 @@ >> +--TEST-- >> +Bug #55509 (segfault on x86_64 using more than 2G memory) >> +--SKIPIF-- >> +<?php >> +if (PHP_INT_SIZE == 4) { >> + die('skip Not for 32-bits OS'); >> +} >> +?> >> +--INI-- >> +memory_limit=3G >> +--FILE-- >> +<?php >> +$a1 = str_repeat("1", 1024 * 1024 * 1024 * 0.5); >> +echo "1\n"; >> +$a2 = str_repeat("2", 1024 * 1024 * 1024 * 0.5); >> +echo "2\n"; >> +$a3 = str_repeat("3", 1024 * 1024 * 1024 * 0.5); >> +echo "3\n"; >> +$a4 = str_repeat("4", 1024 * 1024 * 1024 * 0.5); >> +echo "4\n"; >> +$a5 = str_repeat("5", 1024 * 1024 * 1024 * 0.5); >> +echo "5\n"; >> +$a6 = str_repeat("6", 1024 * 1024 * 1024 * 0.5); >> +echo "6\n"; >> +?> >> +--EXPECTF-- >> +1 >> +2 >> +3 >> +4 >> +5 >> + >> +Fatal error: Allowed memory size of %d bytes exhausted (tried to allocate >> %d bytes) in %s/bug55509.php on line %d >> >> Modified: php/php-src/branches/PHP_5_4/Zend/zend_alloc.c >> =================================================================== >> --- php/php-src/branches/PHP_5_4/Zend/zend_alloc.c 2011-09-13 >> 06:22:25 UTC (rev 316589) >> +++ php/php-src/branches/PHP_5_4/Zend/zend_alloc.c 2011-09-13 >> 07:01:46 UTC (rev 316590) >> @@ -515,7 +515,7 @@ >> #define ZEND_MM_IS_GUARD_BLOCK(b) (((b)->info._size& >> ZEND_MM_TYPE_MASK) == ZEND_MM_GUARD_BLOCK) >> >> #define ZEND_MM_NEXT_BLOCK(b) ZEND_MM_BLOCK_AT(b, >> ZEND_MM_BLOCK_SIZE(b)) >> -#define ZEND_MM_PREV_BLOCK(b) ZEND_MM_BLOCK_AT(b, >> -(int)((b)->info._prev& ~ZEND_MM_TYPE_MASK)) >> +#define ZEND_MM_PREV_BLOCK(b) ZEND_MM_BLOCK_AT(b, >> -(ssize_t)((b)->info._prev& ~ZEND_MM_TYPE_MASK)) >> >> #define ZEND_MM_PREV_BLOCK_IS_FREE(b) (!((b)->info._prev& >> ZEND_MM_USED_BLOCK)) >> >> >> Added: php/php-src/trunk/Zend/tests/bug55509.phpt >> =================================================================== >> --- php/php-src/trunk/Zend/tests/bug55509.phpt >> (rev 0) >> +++ php/php-src/trunk/Zend/tests/bug55509.phpt 2011-09-13 07:01:46 UTC >> (rev 316590) >> @@ -0,0 +1,33 @@ >> +--TEST-- >> +Bug #55509 (segfault on x86_64 using more than 2G memory) >> +--SKIPIF-- >> +<?php >> +if (PHP_INT_SIZE == 4) { >> + die('skip Not for 32-bits OS'); >> +} >> +?> >> +--INI-- >> +memory_limit=3G >> +--FILE-- >> +<?php >> +$a1 = str_repeat("1", 1024 * 1024 * 1024 * 0.5); >> +echo "1\n"; >> +$a2 = str_repeat("2", 1024 * 1024 * 1024 * 0.5); >> +echo "2\n"; >> +$a3 = str_repeat("3", 1024 * 1024 * 1024 * 0.5); >> +echo "3\n"; >> +$a4 = str_repeat("4", 1024 * 1024 * 1024 * 0.5); >> +echo "4\n"; >> +$a5 = str_repeat("5", 1024 * 1024 * 1024 * 0.5); >> +echo "5\n"; >> +$a6 = str_repeat("6", 1024 * 1024 * 1024 * 0.5); >> +echo "6\n"; >> +?> >> +--EXPECTF-- >> +1 >> +2 >> +3 >> +4 >> +5 >> + >> +Fatal error: Allowed memory size of %d bytes exhausted (tried to allocate >> %d bytes) in %s/bug55509.php on line %d >> >> Modified: php/php-src/trunk/Zend/zend_alloc.c >> =================================================================== >> --- php/php-src/trunk/Zend/zend_alloc.c 2011-09-13 06:22:25 UTC (rev >> 316589) >> +++ php/php-src/trunk/Zend/zend_alloc.c 2011-09-13 07:01:46 UTC (rev >> 316590) >> @@ -515,7 +515,7 @@ >> #define ZEND_MM_IS_GUARD_BLOCK(b) (((b)->info._size& >> ZEND_MM_TYPE_MASK) == ZEND_MM_GUARD_BLOCK) >> >> #define ZEND_MM_NEXT_BLOCK(b) ZEND_MM_BLOCK_AT(b, >> ZEND_MM_BLOCK_SIZE(b)) >> -#define ZEND_MM_PREV_BLOCK(b) ZEND_MM_BLOCK_AT(b, >> -(int)((b)->info._prev& ~ZEND_MM_TYPE_MASK)) >> +#define ZEND_MM_PREV_BLOCK(b) ZEND_MM_BLOCK_AT(b, >> -(ssize_t)((b)->info._prev& ~ZEND_MM_TYPE_MASK)) >> >> #define ZEND_MM_PREV_BLOCK_IS_FREE(b) (!((b)->info._prev& >> ZEND_MM_USED_BLOCK)) >> >> >> >> >> > > -- > Email: christopher.jo...@oracle.com > Tel: +1 650 506 8630 > Blog: http://blogs.oracle.com/opal/ > > -- > PHP CVS Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > > -- Ferenc Kovács @Tyr43l - http://tyrael.hu -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php