Skip to content

Commit 7c2155c

Browse files
committed
Move Ai stuff before get_zval_*(), like Andi suggested. Fixes Sascha's huge
memory leak
1 parent e1e2226 commit 7c2155c

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

Zend/zend_execute.c

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,11 +1230,24 @@ binary_assign_op_addr: {
12301230
}
12311231
break;
12321232
case ZEND_INIT_FCALL_BY_NAME: {
1233-
zval *function_name = get_zval_ptr(&opline->op2, Ts, &free_op2, BP_VAR_R);
1233+
zval *function_name;
12341234
zend_function *function;
12351235
HashTable *active_function_table;
12361236
zval tmp;
12371237

1238+
if ((opline>EG(active_op_array)->opcodes)
1239+
&& (opline-1)->opcode == ZEND_JMP_NO_CTOR) {
1240+
/* constructor call */
1241+
if (opline->op1.op_type==IS_VAR) {
1242+
EG(AiCount)++;
1243+
}
1244+
if (opline->op2.op_type==IS_VAR) {
1245+
EG(AiCount)++;
1246+
}
1247+
}
1248+
1249+
function_name = get_zval_ptr(&opline->op2, Ts, &free_op2, BP_VAR_R);
1250+
12381251
tmp = *function_name;
12391252
zval_copy_ctor(&tmp);
12401253
convert_to_string(&tmp);
@@ -1255,12 +1268,6 @@ binary_assign_op_addr: {
12551268
} else { /* used for member function calls */
12561269
object_ptr = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_R);
12571270

1258-
if (opline->op1.op_type==IS_VAR
1259-
&& opline>EG(active_op_array)->opcodes
1260-
&& (opline-1)->opcode == ZEND_JMP_NO_CTOR) {
1261-
/* constructor call */
1262-
EG(AiCount)++;
1263-
}
12641271

12651272
if (!object_ptr || (*object_ptr)->value.obj.ce->handle_function_call) { /* overloaded function call */
12661273
zend_overloaded_element overloaded_element;
@@ -1804,9 +1811,10 @@ binary_assign_op_addr: {
18041811
}
18051812
break;
18061813
case ZEND_JMP_NO_CTOR: {
1807-
zval *object = get_zval_ptr(&opline->op1, Ts, &free_op1, BP_VAR_R);
1814+
zval *object;
18081815

18091816
EG(AiCount)++;
1817+
object = get_zval_ptr(&opline->op1, Ts, &free_op1, BP_VAR_R);
18101818
if (!object->value.obj.ce->handle_function_call
18111819
&& !zend_hash_exists(&object->value.obj.ce->function_table, object->value.obj.ce->name, object->value.obj.ce->name_length+1)) {
18121820
opline = op_array->opcodes + opline->op2.u.opline_num;

0 commit comments

Comments
 (0)