From 7c2155c1adc9bc0f7ebe7a8fce0f4f86aadba7cc Mon Sep 17 00:00:00 2001 From: Zeev Suraski Date: Tue, 13 Apr 1999 20:50:31 +0000 Subject: [PATCH] Move Ai stuff before get_zval_*(), like Andi suggested. Fixes Sascha's huge memory leak --- Zend/zend_execute.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index cd1472a1bd3..d5de1b9f872 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1230,11 +1230,24 @@ binary_assign_op_addr: { } break; case ZEND_INIT_FCALL_BY_NAME: { - zval *function_name = get_zval_ptr(&opline->op2, Ts, &free_op2, BP_VAR_R); + zval *function_name; zend_function *function; HashTable *active_function_table; zval tmp; + if ((opline>EG(active_op_array)->opcodes) + && (opline-1)->opcode == ZEND_JMP_NO_CTOR) { + /* constructor call */ + if (opline->op1.op_type==IS_VAR) { + EG(AiCount)++; + } + if (opline->op2.op_type==IS_VAR) { + EG(AiCount)++; + } + } + + function_name = get_zval_ptr(&opline->op2, Ts, &free_op2, BP_VAR_R); + tmp = *function_name; zval_copy_ctor(&tmp); convert_to_string(&tmp); @@ -1255,12 +1268,6 @@ binary_assign_op_addr: { } else { /* used for member function calls */ object_ptr = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_R); - if (opline->op1.op_type==IS_VAR - && opline>EG(active_op_array)->opcodes - && (opline-1)->opcode == ZEND_JMP_NO_CTOR) { - /* constructor call */ - EG(AiCount)++; - } if (!object_ptr || (*object_ptr)->value.obj.ce->handle_function_call) { /* overloaded function call */ zend_overloaded_element overloaded_element; @@ -1804,9 +1811,10 @@ send_by_ref: } break; case ZEND_JMP_NO_CTOR: { - zval *object = get_zval_ptr(&opline->op1, Ts, &free_op1, BP_VAR_R); + zval *object; EG(AiCount)++; + object = get_zval_ptr(&opline->op1, Ts, &free_op1, BP_VAR_R); if (!object->value.obj.ce->handle_function_call && !zend_hash_exists(&object->value.obj.ce->function_table, object->value.obj.ce->name, object->value.obj.ce->name_length+1)) { opline = op_array->opcodes + opline->op2.u.opline_num;