ID: 48228 User updated by: iddekingej at lycos dot com Reported By: iddekingej at lycos dot com -Status: Verified +Status: Closed Bug Type: Scripting Engine problem Operating System: Linux 64bit gcc PHP Version: 5.*, 6CVS (2009-05-27) New Comment:
I can confirm that this bug is probably caused by a compiler bug as mentioned in bug #48408. When I compiled PHp with 4.1 and run the test script I didn't see the "(tried to allocate 140498868988960 bytes)" message. I also added the debug output as described at [21 May 9:17pm UTC] and the "arg_type_stack.top=-3" bug didn't happen. Previous Comments: ------------------------------------------------------------------------ [2009-05-27 19:24:02] j...@php.net See also bug #48408 ------------------------------------------------------------------------ [2009-05-21 21:17:25] iddekingej at lycos dot com I have some more information about this bug: THis bug happens in the following situation: $l_a->someMethod(other_fy()) When in "other_fy()" a exception is raised this bug occurs. This bug doesn't happen when calling a normal function e.g. someMethod(other_fy()) This bug happens in apache as module and in the CLI. (only in the cli there is no visible clue that something did go wrong). In the function ZEND_HANDLE_EXCEPTION_SPEC_HANDLER (zend_vm_execute.h). I placed some debug output (EX(fbc)->common.function_name and EG(arg_types_stack).top) before: while (EX(fbc)) { EX(called_scope) = (zend_class_entry*)zend_ptr_stack_pop(&EG(arg_types_stack)); if (EX(object)) { and after zend_object_store_ctor_failed(EX(object) TSRMLS_CC); } } zval_ptr_dtor(&EX(object)); } After the exception is raised this function is called. The first time it is called, the variable fbc=NULL and arg_types_stack.top =3. Because EX(fbc)=NULL the while loop is skipped. When this function is called the second time and fbc is not null(Contains data from the method "check") , and arg_type_stack.top is still 3. After the while loop arg_type_stack.top=-3, which is afcourse wrong . Because of this some memory corruption occurs. So maybe when calling a method and a expception is raised when the parameters are calculated the variable "fbc" is not set correctly or there is a missing "zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));" ------------------------------------------------------------------------ [2009-05-21 11:03:40] lbarn...@php.net Verified with gcc 4.3.3 with -O2 on 5.2 and 5.3. (./configure --disable-all) Shorter reproduce script: <? function do_throw() { throw new Exception(); } class aa { function check() { } function dosome() { $this->check(do_throw()); } } $l_aa=new aa(); $l_aa->dosome(); ?> The following patch against 5.3 may help to see the problem: Index: Zend/zend_ptr_stack.h =================================================================== RCS file: /repository/ZendEngine2/zend_ptr_stack.h,v retrieving revision 1.22.2.2.2.1.2.3 diff -u -p -r1.22.2.2.2.1.2.3 zend_ptr_stack.h --- Zend/zend_ptr_stack.h 31 Dec 2008 11:15:32 -0000 1.22.2.2.2.1.2.3 +++ Zend/zend_ptr_stack.h 21 May 2009 10:56:26 -0000 @@ -107,6 +107,9 @@ static inline void zend_ptr_stack_push(z static inline void *zend_ptr_stack_pop(zend_ptr_stack *stack) { stack->top--; + if (stack->top < 0) { + return *(void**)0; + } return *(--stack->top_element); } The following patch avoids the crash (don't know exactly why): Index: Zend/zend_vm_def.h =================================================================== RCS file: /repository/ZendEngine2/zend_vm_def.h,v retrieving revision 1.59.2.29.2.48.2.90 diff -u -p -r1.59.2.29.2.48.2.90 zend_vm_def.h --- Zend/zend_vm_def.h 8 Apr 2009 13:19:34 -0000 1.59.2.29.2.48.2.90 +++ Zend/zend_vm_def.h 21 May 2009 11:01:28 -0000 @@ -4296,7 +4296,8 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTI zval_ptr_dtor(&EX(object)); } EX(called_scope) = DECODE_CTOR(EX(called_scope)); - zend_ptr_stack_2_pop(&EG(arg_types_stack), (void**)&EX(object), (void**)&EX(fbc)); + EX(object) = zend_ptr_stack_pop(&EG(arg_types_stack)); + EX(fbc) = zend_ptr_stack_pop(&EG(arg_types_stack)); } for (i=0; i<EX(op_array)->last_brk_cont; i++) { ------------------------------------------------------------------------ [2009-05-21 07:41:11] iddekingej at lycos dot com It is the default apache2 for kubuntu 8.10: apache2 2.2.9/Prefork ------------------------------------------------------------------------ [2009-05-21 00:46:57] j...@php.net What MPM are you using in Apache? (and when you give feedback, change the status to 'Open'..) ------------------------------------------------------------------------ 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 http://bugs.php.net/48228 -- Edit this bug report at http://bugs.php.net/?id=48228&edit=1