From: Xinchen Hui Date: Mon, 6 Jul 2015 07:22:40 +0000 (+0800) Subject: Fixed segfault while with generating ext info X-Git-Tag: php-7.0.0beta1~12^2~47 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ce550cefdee426d3dc3fcbe3864686c0cab7ad90;p=php Fixed segfault while with generating ext info --- diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index f595edca9b..2f8f637c64 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -355,6 +355,13 @@ void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t (slot)[1] = (ptr); \ } while (0) +#define SKIP_EXT_OPLINE(opline) do { \ + while (UNEXPECTED((opline)->opcode <= ZEND_TICKS \ + && (opline)->opcode >= ZEND_EXT_STMT)) { \ + (opline)--; \ + } \ + } while (0) + END_EXTERN_C() #endif /* ZEND_EXECUTE_H */ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d31bf9b88e..fb86a8d42a 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -7868,9 +7868,10 @@ ZEND_VM_HANDLER(151, ZEND_ASSERT_CHECK, ANY, ANY) if (EG(assertions) <= 0) { zend_op *target = OP_JMP_ADDR(opline, opline->op2); - - if (RETURN_VALUE_USED(target-1)) { - ZVAL_TRUE(EX_VAR((target-1)->result.var)); + zend_op *result = target - 1; + SKIP_EXT_OPLINE(result); + if (RETURN_VALUE_USED(result)) { + ZVAL_TRUE(EX_VAR(result->result.var)); } ZEND_VM_JMP(target); } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 1d78881232..a948964e91 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1657,9 +1657,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSERT_CHECK_SPEC_HANDLER(ZEND if (EG(assertions) <= 0) { zend_op *target = OP_JMP_ADDR(opline, opline->op2); - - if (RETURN_VALUE_USED(target-1)) { - ZVAL_TRUE(EX_VAR((target-1)->result.var)); + zend_op *result = target - 1; + SKIP_EXT_OPLINE(result); + if (RETURN_VALUE_USED(result)) { + ZVAL_TRUE(EX_VAR(result->result.var)); } ZEND_VM_JMP(target); } else {