]> granicus.if.org Git - php/commitdiff
Fixed bug #74269: Strict comparison of initial trait property values
authorPedro Magalhães <mail@pmmaga.net>
Mon, 10 Apr 2017 20:04:18 +0000 (22:04 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 1 May 2017 10:59:27 +0000 (12:59 +0200)
NEWS
UPGRADING
Zend/tests/bug74269.phpt [new file with mode: 0644]
Zend/zend_inheritance.c

diff --git a/NEWS b/NEWS
index a69981536aaf27311472e72238d02449245a2729..80aa4ec8cc0d34d56086cbf482a0917c6e4b59dc 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -41,6 +41,8 @@ PHP                                                                        NEWS
     to interned strings handling in TS builds. (Anatol, Dmitry)
   . Implemented "Trailing Commas In List Syntax" RFC for group use lists only.
     (Sammy Kaye Powers)
+  . Fixed bug #74269 (It's possible to override trait property with different
+    loosely-equal value). (pmmaga)
 
 - BCMath:
   . Fixed bug #46564 (bcmod truncates fractionals). (liborm85)
index e1877667bad544c3d05bcbf65bfe68e8940e6728..78ce94cedcda0e7947a4becf5a0985bdffacf714 100644 (file)
--- a/UPGRADING
+++ b/UPGRADING
@@ -39,6 +39,8 @@ PHP 7.2 UPGRADE NOTES
     of a notice. They will generate an Error in a future version of PHP.
     (https://wiki.php.net/rfc/deprecate-bareword-strings)
   . Minimum supported Windows versions are Windows 7/Server 2008 R2.
+  . Initial trait property value compatibility check will no longer perform
+    any casts. (Bug #74269)
 
 - BCMath:
   . The bcmod() function no longer truncates fractional numbers to integers. As
diff --git a/Zend/tests/bug74269.phpt b/Zend/tests/bug74269.phpt
new file mode 100644 (file)
index 0000000..53ef570
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Bug #74269: It's possible to override trait property with different loosely-equal value
+--FILE--
+<?php
+trait PropertiesTrait
+{
+    public $same = true;
+}
+
+class PropertiesExample
+{
+    use PropertiesTrait;
+    public $same = 2;
+}
+?>
+--EXPECTF--
+Fatal error: PropertiesExample and PropertiesTrait define the same property ($same) in the composition of PropertiesExample. However, the definition differs and is considered incompatible. Class was composed in %s
index 71b3eb06dad07a37e49ca34bee1b27b500994ea4..675d8c4b75d0c581c82a9b3128065be04cd24e4f 100644 (file)
@@ -23,7 +23,7 @@
 #include "zend_execute.h"
 #include "zend_inheritance.h"
 #include "zend_smart_str.h"
-#include "zend_inheritance.h"
+#include "zend_operators.h"
 
 static void overriden_ptr_dtor(zval *zv) /* {{{ */
 {
@@ -1576,15 +1576,11 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */
                                                == (flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC))) {
                                                /* flags are identical, now the value needs to be checked */
                                                if (flags & ZEND_ACC_STATIC) {
-                                                       not_compatible = (FAILURE == compare_function(&compare_result,
-                                                                                         &ce->default_static_members_table[coliding_prop->offset],
-                                                                                         &ce->traits[i]->default_static_members_table[property_info->offset]))
-                                                                 || (Z_LVAL(compare_result) != 0);
+                                                       not_compatible = fast_is_not_identical_function(&ce->default_static_members_table[coliding_prop->offset],
+                                                                                         &ce->traits[i]->default_static_members_table[property_info->offset]);
                                                } else {
-                                                       not_compatible = (FAILURE == compare_function(&compare_result,
-                                                                                         &ce->default_properties_table[OBJ_PROP_TO_NUM(coliding_prop->offset)],
-                                                                                         &ce->traits[i]->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)]))
-                                                                 || (Z_LVAL(compare_result) != 0);
+                                                       not_compatible = fast_is_not_identical_function(&ce->default_properties_table[OBJ_PROP_TO_NUM(coliding_prop->offset)],
+                                                                                         &ce->traits[i]->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)]);
                                                }
                                        } else {
                                                /* the flags are not identical, thus, we assume properties are not compatible */