diff options
author | Xinchen Hui <laruence@php.net> | 2015-07-06 15:22:40 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@php.net> | 2015-07-06 15:22:40 +0800 |
commit | ce550cefdee426d3dc3fcbe3864686c0cab7ad90 (patch) | |
tree | 7d23cb17b1985e81e5ae13a8c24a089d0c5ae78b | |
parent | a97f7644725fab6a6c3681b3062f40994a218cb6 (diff) | |
download | php-git-ce550cefdee426d3dc3fcbe3864686c0cab7ad90.tar.gz |
Fixed segfault while with generating ext info
-rw-r--r-- | Zend/zend_execute.h | 7 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 7 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 7 |
3 files changed, 15 insertions, 6 deletions
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 { |