summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@php.net>2015-07-06 15:22:40 +0800
committerXinchen Hui <laruence@php.net>2015-07-06 15:22:40 +0800
commitce550cefdee426d3dc3fcbe3864686c0cab7ad90 (patch)
tree7d23cb17b1985e81e5ae13a8c24a089d0c5ae78b
parenta97f7644725fab6a6c3681b3062f40994a218cb6 (diff)
downloadphp-git-ce550cefdee426d3dc3fcbe3864686c0cab7ad90.tar.gz
Fixed segfault while with generating ext info
-rw-r--r--Zend/zend_execute.h7
-rw-r--r--Zend/zend_vm_def.h7
-rw-r--r--Zend/zend_vm_execute.h7
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 {