From 2091ed8f980fb9a5966cf09012924a7850b1c695 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Tue, 16 Jul 2024 18:15:06 +0200 Subject: [PATCH 1/3] Fix indirect readonly error messages $obj->ro[] = 42; should emit an indirect modification error message. This message already existed but was used inconsistently. --- Zend/tests/enum/no-pass-properties-by-ref.phpt | 2 +- Zend/tests/enum/no-return-properties-by-ref.phpt | 2 +- ...write-properties-through-foreach-reference.phpt | 2 +- .../no-write-properties-through-references.phpt | 2 +- Zend/tests/readonly_props/cache_slot.phpt | 14 +++++++------- .../readonly_props/readonly_clone_error5.phpt | 8 ++++---- .../readonly_props/readonly_modification.phpt | 10 +++++----- Zend/tests/readonly_props/variation.phpt | 4 ++-- Zend/zend_object_handlers.c | 2 +- ext/opcache/jit/zend_jit_ir.c | 4 ++-- 10 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Zend/tests/enum/no-pass-properties-by-ref.phpt b/Zend/tests/enum/no-pass-properties-by-ref.phpt index 46fdeca14daf2..21c3a41e9352c 100644 --- a/Zend/tests/enum/no-pass-properties-by-ref.phpt +++ b/Zend/tests/enum/no-pass-properties-by-ref.phpt @@ -22,5 +22,5 @@ var_dump(Foo::Bar->value); ?> --EXPECT-- -Cannot modify readonly property Foo::$value +Cannot indirectly modify readonly property Foo::$value int(0) diff --git a/Zend/tests/enum/no-return-properties-by-ref.phpt b/Zend/tests/enum/no-return-properties-by-ref.phpt index 2ec1960a2d172..ea68e7a585cc6 100644 --- a/Zend/tests/enum/no-return-properties-by-ref.phpt +++ b/Zend/tests/enum/no-return-properties-by-ref.phpt @@ -23,5 +23,5 @@ var_dump(Foo::Bar->value); ?> --EXPECT-- -Cannot modify readonly property Foo::$value +Cannot indirectly modify readonly property Foo::$value int(0) diff --git a/Zend/tests/enum/no-write-properties-through-foreach-reference.phpt b/Zend/tests/enum/no-write-properties-through-foreach-reference.phpt index dbbad006c7591..b02f499329041 100644 --- a/Zend/tests/enum/no-write-properties-through-foreach-reference.phpt +++ b/Zend/tests/enum/no-write-properties-through-foreach-reference.phpt @@ -18,5 +18,5 @@ var_dump(Foo::Bar->value); ?> --EXPECT-- -Cannot modify readonly property Foo::$value +Cannot indirectly modify readonly property Foo::$value int(0) diff --git a/Zend/tests/enum/no-write-properties-through-references.phpt b/Zend/tests/enum/no-write-properties-through-references.phpt index 43d409d6b1dc8..17bd57b82ea29 100644 --- a/Zend/tests/enum/no-write-properties-through-references.phpt +++ b/Zend/tests/enum/no-write-properties-through-references.phpt @@ -19,5 +19,5 @@ var_dump(Foo::Bar->value); ?> --EXPECT-- -Cannot modify readonly property Foo::$value +Cannot indirectly modify readonly property Foo::$value int(0) diff --git a/Zend/tests/readonly_props/cache_slot.phpt b/Zend/tests/readonly_props/cache_slot.phpt index 75c26a2d1808e..e6f119a7e22d7 100644 --- a/Zend/tests/readonly_props/cache_slot.phpt +++ b/Zend/tests/readonly_props/cache_slot.phpt @@ -88,35 +88,35 @@ $replaceProp3(); var_dump($test->prop3); ?> ---EXPECT-- +--EXPECTF-- string(1) "a" Cannot modify readonly property Test::$prop string(1) "a" -Cannot modify readonly property Test::$prop2 +Cannot indirectly modify readonly property Test::$prop2 Cannot modify readonly property Test::$prop2 array(0) { } -object(stdClass)#3 (1) { +object(stdClass)#%d (1) { ["foo"]=> int(1) } -object(stdClass)#3 (1) { +object(stdClass)#%d (1) { ["foo"]=> int(1) } -Cannot modify readonly property Test::$prop2 +Cannot indirectly modify readonly property Test::$prop2 Cannot modify readonly property Test::$prop2 array(0) { } -object(stdClass)#5 (1) { +object(stdClass)#%d (1) { ["foo"]=> int(1) } -object(stdClass)#5 (1) { +object(stdClass)#%d (1) { ["foo"]=> int(1) } diff --git a/Zend/tests/readonly_props/readonly_clone_error5.phpt b/Zend/tests/readonly_props/readonly_clone_error5.phpt index c6651b54edb85..a33363b591f8c 100644 --- a/Zend/tests/readonly_props/readonly_clone_error5.phpt +++ b/Zend/tests/readonly_props/readonly_clone_error5.phpt @@ -57,20 +57,20 @@ try { } ?> ---EXPECT-- -object(TestSetOnce)#2 (1) { +--EXPECTF-- +object(TestSetOnce)#%d (1) { ["prop"]=> array(1) { [0]=> int(1) } } -object(TestSetOnce)#1 (1) { +object(TestSetOnce)#%d (1) { ["prop"]=> array(1) { [0]=> int(1) } } -Cannot modify readonly property TestSetTwice::$prop +Cannot indirectly modify readonly property TestSetTwice::$prop Cannot modify readonly property TestSetTwice::$prop diff --git a/Zend/tests/readonly_props/readonly_modification.phpt b/Zend/tests/readonly_props/readonly_modification.phpt index 5f2a0c9ca5f50..bd04a203be196 100644 --- a/Zend/tests/readonly_props/readonly_modification.phpt +++ b/Zend/tests/readonly_props/readonly_modification.phpt @@ -73,10 +73,10 @@ Cannot modify readonly property Test::$prop Cannot modify readonly property Test::$prop Cannot modify readonly property Test::$prop Cannot modify readonly property Test::$prop -Cannot modify readonly property Test::$prop -Cannot modify readonly property Test::$prop -Cannot modify readonly property Test::$prop +Cannot indirectly modify readonly property Test::$prop +Cannot indirectly modify readonly property Test::$prop +Cannot indirectly modify readonly property Test::$prop array(0) { } -Cannot modify readonly property Test::$prop2 -Cannot modify readonly property Test::$prop2 +Cannot indirectly modify readonly property Test::$prop2 +Cannot indirectly modify readonly property Test::$prop2 diff --git a/Zend/tests/readonly_props/variation.phpt b/Zend/tests/readonly_props/variation.phpt index a8ea4be60887e..1c93f3f6f5994 100644 --- a/Zend/tests/readonly_props/variation.phpt +++ b/Zend/tests/readonly_props/variation.phpt @@ -95,13 +95,13 @@ foreach ([true, false] as $init) { Init: 1, scope: 1, op: r: 1 Init: 1, scope: 1, op: w: Cannot modify readonly property Test::$prop Init: 1, scope: 1, op: rw: Cannot modify readonly property Test::$prop -Init: 1, scope: 1, op: im: Cannot modify readonly property Test::$prop +Init: 1, scope: 1, op: im: Cannot indirectly modify readonly property Test::$prop Init: 1, scope: 1, op: is: 1 Init: 1, scope: 1, op: us: Cannot unset readonly property Test::$prop Init: 1, scope: 0, op: r: 1 Init: 1, scope: 0, op: w: Cannot modify readonly property Test::$prop Init: 1, scope: 0, op: rw: Cannot modify readonly property Test::$prop -Init: 1, scope: 0, op: im: Cannot modify readonly property Test::$prop +Init: 1, scope: 0, op: im: Cannot indirectly modify readonly property Test::$prop Init: 1, scope: 0, op: is: 1 Init: 1, scope: 0, op: us: Cannot unset readonly property Test::$prop Init: 0, scope: 1, op: r: Typed property Test::$prop must not be accessed before initialization diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 603aec24bd0dc..e354e2e69a417 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -697,7 +697,7 @@ ZEND_API zval *zend_std_read_property(zend_object *zobj, zend_string *name, int } else if (Z_PROP_FLAG_P(retval) & IS_PROP_REINITABLE) { Z_PROP_FLAG_P(retval) &= ~IS_PROP_REINITABLE; } else { - zend_readonly_property_modification_error(prop_info); + zend_readonly_property_indirect_modification_error(prop_info); retval = &EG(uninitialized_zval); } } diff --git a/ext/opcache/jit/zend_jit_ir.c b/ext/opcache/jit/zend_jit_ir.c index 5ee8ff9e84ee6..80099291d886d 100644 --- a/ext/opcache/jit/zend_jit_ir.c +++ b/ext/opcache/jit/zend_jit_ir.c @@ -13959,7 +13959,7 @@ static int zend_jit_fetch_obj(zend_jit_ctx *jit, ir_IF_FALSE(if_reinitable); jit_SET_EX_OPLINE(jit, opline); - ir_CALL_1(IR_VOID, ir_CONST_FC_FUNC(zend_readonly_property_modification_error), prop_info_ref); + ir_CALL_1(IR_VOID, ir_CONST_FC_FUNC(zend_readonly_property_indirect_modification_error), prop_info_ref); jit_set_Z_TYPE_INFO(jit, res_addr, _IS_ERROR); ir_END_list(end_inputs); @@ -14033,7 +14033,7 @@ static int zend_jit_fetch_obj(zend_jit_ctx *jit, ir_IF_FALSE(if_reinitable); jit_SET_EX_OPLINE(jit, opline); - ir_CALL_1(IR_VOID, ir_CONST_FC_FUNC(zend_readonly_property_modification_error), ir_CONST_ADDR(prop_info)); + ir_CALL_1(IR_VOID, ir_CONST_FC_FUNC(zend_readonly_property_indirect_modification_error), ir_CONST_ADDR(prop_info)); jit_set_Z_TYPE_INFO(jit, res_addr, _IS_ERROR); ir_END_list(end_inputs); From e39200275272718a1663750bdd5208048f38fd92 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Tue, 16 Jul 2024 19:29:28 +0200 Subject: [PATCH 2/3] Fix message with cache slot --- Zend/zend_execute.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c0e428fb0eca5..89904af06d2ad 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -3367,7 +3367,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } else if (Z_PROP_FLAG_P(ptr) & IS_PROP_REINITABLE) { Z_PROP_FLAG_P(ptr) &= ~IS_PROP_REINITABLE; } else { - zend_readonly_property_modification_error(prop_info); + zend_readonly_property_indirect_modification_error(prop_info); ZVAL_ERROR(result); } return; From b824362d8c95a59a4028a660a83ef5525e11a899 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Tue, 16 Jul 2024 22:46:25 +0200 Subject: [PATCH 3/3] Fix tests again --- Zend/tests/readonly_props/cache_slot.phpt | 2 +- Zend/tests/readonly_props/readonly_clone_error5.phpt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/tests/readonly_props/cache_slot.phpt b/Zend/tests/readonly_props/cache_slot.phpt index e6f119a7e22d7..af7f73c36eb99 100644 --- a/Zend/tests/readonly_props/cache_slot.phpt +++ b/Zend/tests/readonly_props/cache_slot.phpt @@ -108,7 +108,7 @@ object(stdClass)#%d (1) { } Cannot indirectly modify readonly property Test::$prop2 -Cannot modify readonly property Test::$prop2 +Cannot indirectly modify readonly property Test::$prop2 array(0) { } diff --git a/Zend/tests/readonly_props/readonly_clone_error5.phpt b/Zend/tests/readonly_props/readonly_clone_error5.phpt index a33363b591f8c..84084260e9f64 100644 --- a/Zend/tests/readonly_props/readonly_clone_error5.phpt +++ b/Zend/tests/readonly_props/readonly_clone_error5.phpt @@ -73,4 +73,4 @@ object(TestSetOnce)#%d (1) { } } Cannot indirectly modify readonly property TestSetTwice::$prop -Cannot modify readonly property TestSetTwice::$prop +Cannot indirectly modify readonly property TestSetTwice::$prop