summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Weinand <bobwei9@hotmail.com>2016-12-03 18:23:58 +0100
committerBob Weinand <bobwei9@hotmail.com>2016-12-03 18:28:08 +0100
commitffc1ef1eed79aaacfd13b5dd2988ee25e3533875 (patch)
tree86626f0519bf9aa72af1de1a169eca531f34b1d4
parenta8ec79e27f3c9284db31941fc0233dcc90261812 (diff)
downloadphp-git-ffc1ef1eed79aaacfd13b5dd2988ee25e3533875.tar.gz
Fix leak when using $this outside of object context
-rw-r--r--Zend/tests/assign_to_obj_002.phpt12
-rw-r--r--Zend/zend_vm_def.h1
-rw-r--r--Zend/zend_vm_execute.h9
3 files changed, 22 insertions, 0 deletions
diff --git a/Zend/tests/assign_to_obj_002.phpt b/Zend/tests/assign_to_obj_002.phpt
new file mode 100644
index 0000000000..0ab2e84163
--- /dev/null
+++ b/Zend/tests/assign_to_obj_002.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Assign to $this leaks when $this not defined
+--FILE--
+<?php
+
+try {
+ $this->a = new stdClass;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+
+?>
+--EXPECT--
+Using $this when not in object context
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 91e5b38914..4f8dbcaea1 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -2142,6 +2142,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV)
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
zend_throw_error(NULL, "Using $this when not in object context");
FREE_UNFETCHED_OP2();
+ FREE_UNFETCHED_OP_DATA();
HANDLE_EXCEPTION();
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 43d4256027..e37c1729ea 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -17530,6 +17530,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_HAND
if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
zend_throw_error(NULL, "Using $this when not in object context");
+ FREE_UNFETCHED_OP_DATA();
HANDLE_EXCEPTION();
}
@@ -20754,6 +20755,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_HANDLER
if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
zend_throw_error(NULL, "Using $this when not in object context");
+ FREE_UNFETCHED_OP_DATA();
HANDLE_EXCEPTION();
}
@@ -22434,6 +22436,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_HAN
if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
zend_throw_error(NULL, "Using $this when not in object context");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ FREE_UNFETCHED_OP_DATA();
HANDLE_EXCEPTION();
}
@@ -23918,6 +23921,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_H
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
zend_throw_error(NULL, "Using $this when not in object context");
+ FREE_UNFETCHED_OP_DATA();
HANDLE_EXCEPTION();
}
@@ -26349,6 +26353,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_HAND
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
zend_throw_error(NULL, "Using $this when not in object context");
+ FREE_UNFETCHED_OP_DATA();
HANDLE_EXCEPTION();
}
@@ -27857,6 +27862,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
zend_throw_error(NULL, "Using $this when not in object context");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ FREE_UNFETCHED_OP_DATA();
HANDLE_EXCEPTION();
}
@@ -31977,6 +31983,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_HANDL
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
zend_throw_error(NULL, "Using $this when not in object context");
+ FREE_UNFETCHED_OP_DATA();
HANDLE_EXCEPTION();
}
@@ -37026,6 +37033,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_HANDLER(
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
zend_throw_error(NULL, "Using $this when not in object context");
+ FREE_UNFETCHED_OP_DATA();
HANDLE_EXCEPTION();
}
@@ -39712,6 +39720,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_HAND
if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
zend_throw_error(NULL, "Using $this when not in object context");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ FREE_UNFETCHED_OP_DATA();
HANDLE_EXCEPTION();
}