From ffc1ef1eed79aaacfd13b5dd2988ee25e3533875 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 3 Dec 2016 18:23:58 +0100 Subject: [PATCH] Fix leak when using $this outside of object context --- Zend/tests/assign_to_obj_002.phpt | 12 ++++++++++++ Zend/zend_vm_def.h | 1 + Zend/zend_vm_execute.h | 9 +++++++++ 3 files changed, 22 insertions(+) create mode 100644 Zend/tests/assign_to_obj_002.phpt 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-- +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(); } -- 2.40.0