Edit report at https://bugs.php.net/bug.php?id=61046&edit=1
ID: 61046 Updated by: php-bugs@lists.php.net Reported by: ni...@php.net Summary: Segfault when memory limit is hit while copying hash table -Status: Feedback +Status: No Feedback Type: Bug Package: Reproducible crash PHP Version: 5.4.0RC7 Assigned To: laruence New Comment: No feedback was provided. The bug is being suspended because we assume that you are no longer experiencing the problem. If this is not the case and you are able to provide the information that was requested earlier, please do so and change the status of the bug back to "Open". Thank you. Previous Comments: ------------------------------------------------------------------------ [2012-12-20 15:28:22] larue...@php.net another way to fix this is promote the ht point assignment in ctor(list blow), but there is still a chance that alloc failed when try to alloc memory for ht. so I still think the fix I attached is the better one. diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index 25a66a1..bb6927a 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -134,9 +134,9 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC) return; /* do nothing */ } ALLOC_HASHTABLE_REL(tmp_ht); + zvalue->value.ht = tmp_ht; zend_hash_init(tmp_ht, zend_hash_num_elements(original_ht), NULL, ZVAL_PTR_DTOR, 0); zend_hash_copy(tmp_ht, original_ht, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); - zvalue->value.ht = tmp_ht; } break; case IS_OBJECT: ------------------------------------------------------------------------ [2012-12-20 15:08:30] larue...@php.net quick fix attached, could you please verify it? ------------------------------------------------------------------------ [2012-12-20 15:07:27] larue...@php.net The following patch has been added/updated: Patch Name: bug61046.patch Revision: 1356016047 URL: https://bugs.php.net/patch-display.php?bug=61046&patch=bug61046.patch&revision=1356016047 ------------------------------------------------------------------------ [2012-12-20 11:18:02] arrtedone at gmail dot com Description: ------------ Same here, reproducable, but with memory limit set to 128M (note that i am not using the provided test script, it crached randomly) Test script: ------------- - System information : OS : Fedora 17 Linux nask0 3.6.10-2.fc17.x86_64 #1 SMP Tue Dec 11 18:07:34 UTC 2012 x86_64 PHP version 5.4.9 : PHP API : 20100412 PHP Extension : 20100525 Zend Extension : 220100525 Zend Extension Build : API220100525,NTS PHP Extension Build : API20100525,NTS Thread Safety: disabled Zend Signal Handling: disabled Zend Memory Manager: enabled Apache Version: Apache/2.2.22 (Fedora) DAV/2 PHP/5.4.9 Apache API Version : 20051115 GDB backtrace : --------------- Program received signal SIGSEGV, Segmentation fault. zend_mm_remove_from_free_list (heap=0x7f75283c10d0, mm_block=0x7f752a24b3f8) at /usr/src/debug/php-5.4.9/Zend/zend_alloc.c:833 833 if (UNEXPECTED(prev->next_free_block != mm_block) || UNEXPECTED(next->prev_free_block != mm_block)) { (gdb) continue Continuing. Program terminated with signal SIGSEGV, Segmentation fault. The program no longer exists. ------------------------------------------------------------------------ [2012-02-10 18:08:37] ras...@php.net Same here. Reproducable on 64-bit Linux with memory_limit set to "512k". The segfault is here: zend_mm_remove_from_free_list (heap=0xf71730, mm_block=0x7ffff7fae1c8) at /home/rasmus/php-src/branches/PHP_5_4/Zend/zend_alloc.c:805 805 ZEND_MM_CHECK_TREE(mm_block); (gdb) p *mm_block $2 = {info = {_size = 16400, _prev = 57}, prev_free_block = 0x7ffff7fae1c8, next_free_block = 0x7ffff7fae1c8, parent = 0x0, child = {0x0, 0x0}} Note that parent is NULL there and ZEND_MM_CHECK_TREE tries to dereference *parent ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=61046 -- Edit this bug report at https://bugs.php.net/bug.php?id=61046&edit=1